我正在制定解决经济学模型的计划。首先,我声明一个命名空间如下:
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
丢失了第一个维度。任何帮助将非常感谢!!
答案 0 :(得分:2)
首先,您的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
仅返回上次比较的值。所以,你有效地迭代到k<myNameSpace::d3
。你写的for
循环 - 只是一个循环。它并没有像您所希望的那样迭代i
,j
和k
的所有可能值组合。
它将i
,j
,k
初始化为0;检查比较表达式(如(1)所解释的那样只检查k
的值);并且在循环中的代码运行之后 - 将i
,j
,k
的全部递增1.因此 - 您只设置{{1 }},0/0/0
,1/1/1
,2/2/2
,直到数组的...
索引。而且,因为你的中间数组有一个小于k/k/k
的边界 - 你通过走出界限来调用未定义的行为。
最后,您只打印数组的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
。是否要使用i
或j
进行循环播放? ...也许它是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上运行。一旦我改变它,我就收到了一些价值。