C ++通过引用函数传递数组但内容保持不变

时间:2017-08-07 16:18:01

标签: c++ arrays multidimensional-array

我正在制定解决经济学模型的计划。首先,我声明一个命名空间如下:

namespace myNameSpace
{
    const int d1{10};
    const int d2{5};
    const int d3{7};
    double array[d1][d2][d3]={};
}

然后,我有一个修改array

的函数
void doSomething(double (&array)[myNameSpace::d1][myNameSpace::d2][myNameSpace::d3])
{
    int i,j,k;
    for (i=0, j=0, k=0; i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3; i++,j++,k++)
        array[i][j][k]=i+j+k+1.0;
}

在主要功能中,我将doSomething称为:

int main()
{
    doSomething(myNameSpace::array);
    for (int i=0;j<myNameSpace::d1;j++)
        std::cout << myNameSpace::array[i][1][1] << std::endl;
}

我在控制台中获得的输出是:

0
0
0

您能就此提供任何指导吗?我尝试在没有地址操作符array的情况下传递&,但是在doSomething内,array丢失了第一个维度。任何帮助将非常感谢!!

4 个答案:

答案 0 :(得分:2)

首先,您的for循环

for (i=0, j=0, k=0; i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3; i++,j++,k++)

没有做你认为它做的事情,你会(希望)注意到如果你编译了警告(警告:关系比较结果未使用)。

它有2个相关的主要问题:

  1. 由于使用comma operatori<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3仅返回上次比较的值。所以,你有效地迭代到k<myNameSpace::d3
  2. 你写的for循环 - 只是一个循环。它并没有像您所希望的那样迭代ijk的所有可能值组合。

    它将ijk初始化为0;检查比较表达式(如(1)所解释的那样只检查k的值);并且在循环中的代码运行之后 - 将ijk全部递增1.因此 - 您只设置{{1 }},0/0/01/1/12/2/2,直到数组的...索引。而且,因为你的中间数组有一个小于k/k/k的边界 - 你通过走出界限来调用未定义的行为。

  3. 最后,您只打印数组的k索引,因为索引范围i/1/1 - 0/1/1中唯一的一个值是d1/1/1 - exactly打印的内容为非零值。

    迭代整个数组,因为,可能是你的意图 - 你应该使用嵌套循环,所以它们将允许所有的循环变量彼此独立地改变:

    1/1/1

答案 1 :(得分:0)

我试图编译你的代码,我在这一行得到了一个错误:

for (int i=0;j<myNameSpace::d1;j++)

变量j未声明。您可以注意到,您在i循环中声明了变量for,但没有j。是否要使用ij进行循环播放? ...也许它是i因为在循环体内你用它作为第一维索引?

那么,也许你的意思是这个代码?

for (int i = 0; i < myNameSpace::d1; i++)
    std::cout << myNameSpace::array[i][1][1] << std::endl;

此外,您确定doSomething内的循环是否符合您的意思?

或许您想为每个数组维度使用三个嵌套循环进行循环? E.g:

void doSomething(double (&array)[myNameSpace::d1][myNameSpace::d2][myNameSpace::d3])
{   
    for (int i = 0; i < myNameSpace::d1; i++) {
        for (int j = 0; j < myNameSpace::d2; j++) {
            for (int k = 0; k < myNameSpace::d3; k++) {
                array[i][j][k] = i + j + k + 1.0;
            }
        }
    }
}

请注意,在C ++中,原始数组是通过引用传递的,因此不需要&array语法。此外,编译器还会忽略数组参数的原始数组维度(myNameSpace::d1等)。这些可能对文档有用。

答案 2 :(得分:0)

如果你的数组以这些大小声明,那么它的编写时间更短(和可读):

void doSomething( declspec(myNameSpace::array) &array )

或者更好地声明类型别名以便在任何地方使用它:

using  myArrayType = double[myNameSpace::d1][myNameSpace::d2][myNameSpace::d3];

更不用说d1,d2和d3应为const。 Toset所有数组元素你的循环应如下所示:

void doSomething( myArrayType &array )
{
   int i,j,k;
   for ( i = 0; i < myNameSpace::d1; i++)
     for ( j = 0; j < myNameSpace::d2; j++)
      for (k = 0; k < myNameSpace::d3; k++)
         array[i][j][k]=i+j+k+1.0;
}

用逗号分隔的所有单一内容都是在单次迭代中进行的。有一些变态的方法可以单独写入(),但我不建议使用该代码。 for()循环非常灵活。几乎看起来像

for(expressionFirst; expressionCheck; expressionEach )
    statement to execute

expressionFirst 可以是ANY语句或单个声明,它只在循环开始之前执行一次。 expressionCheck 在每次迭代开始时执行,它必须是上下文可转换为bool的任何表达式(即如果偶数explicit T::operator bool() const;适用于此情况),如果它返回false ,循环停止。 expressionEach 是在每次迭代结束时计算的任何表达式。

for()

的等价物
{
   expressionFirst
   while ( expressionCheck ) 
   { 
     statement to execute
     expressionEach; 
   }  
} 

所有表达式都是可选的,因此您可以使用for(;;) - a&#34;永远&#34;循环。

您使用的逗号运算符允许对多个表达式进行排序,结果只返回最后一个表达式。因此它被称为序列运算符。这就是你的循环错误的原因。

你在main函数中输入了一个拼写错误,导致你只打印数组的第一个元素,没有i的增量。

答案 3 :(得分:0)

开始时你的for循环有问题 初始化我并在j上运行。一旦我改变它,我就收到了一些价值。