我正在开发一个解决经济学模型的程序。首先,我声明一个命名空间如下:
namespace myNameSpace
{
const int d1{10};
const int d2{5};
const int d3{7};
double array[d1][d2][d3]={};
}
然后,我有一个修改数组
的函数:
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
丢失了第一维。任何帮助将不胜感激!!
最佳答案
首先,您的 for
循环
for (i=0, j=0, k=0; i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3; i++,j++,k++)
没有按照您的想法行事,如果您编译时带有警告(警告:关系比较结果未使用),您会(希望)注意到这一点。
它有 2 个相关的主要问题:
自
i<myNameSpace::d1,j<myNameSpace::d2,k<myNameSpace::d3
由于 comma operator,只返回最后一次比较的值正在使用。因此,您实际上是在迭代直到k<myNameSpace::d3
。 .for
你写的循环 - 只是一个循环。它不会遍历i
的所有可能值组合。 ,j
, 和k
,如您所愿。它初始化
i
,j
,k
到 0;检查比较表达式(如 (1) 所述,它仅检查k
的值);在循环中的代码运行后 - 递增i
的 all ,j
,k
1. 因此 - 你只设置了0/0/0
,1/1/1
,2/2/2
,...
, 直到k/k/k
你的数组的索引。而且,因为你的中间数组有一个边界,它小于k
- 您通过越界调用未定义的行为。
最后,您只打印 i/1/1
数组的索引,并且因为索引范围内只有一个值 0/1/1
- d1/1/1
设置为 1/1/1
- 它是,exactly用非零值打印的内容。
遍历整个数组,这可能是您的意图 - 您应该使用嵌套循环,这样它们将允许所有循环变量相互独立地改变:
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;
}
}
}
关于C++通过引用函数传递数组但内容保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551477/