我正在编写一个方法来创建一个浮点数组的副本。在调试之后,我得到了一些非常奇怪的值,所以我想我会问这个,因为我无法通过阅读C ++数组常见问题解答这一点。
以下是代码的相关部分(它是一个庞大程序的一部分,其中大部分内容与此帖无关):
// height and width are integer global variables
void method () {
float testArray[height][width];
for(int j = 0; j < height; ++j) {
for(int i = 0; i < width; ++i) {
testArray[j][i] -= 0.0;
std::cout << testArray[j][i] << std::endl;
}
}
}
(在我的测试中,height = 32和width = 256,但这不应该是相关的。)当我初始化testArray时,它的值应该都是0.0,对吗?然后,在循环中,我从testArray中的某个元素中减去0.0,这在逻辑上根本不会改变该值。但是将testArray的值打印为调试步骤会产生一些奇怪的值,例如以下代码段:
[...]
0
[...]
-3.23805e-24
[...]
8.40779e-45
[...]
1.79513e+37
[...]
0
[...]
3.19586e+36
[...]
最令人担忧的价值是无限的价值,例如上面列出的第四个数字。老实说,我不知道为什么会这样。不是所有这些值都不应该大约为0.0吗?我认为这与浮点运算的不精确有关,但这不应该导致无限值......
答案 0 :(得分:7)
不,当你声明你的数组时,它将是未初始化的,因为它是内置类型。在进行减法之前,您需要将其初始化为零。
但是请注意,声明一个数组(可能是非const维度)是编译器扩展而不是语言的一部分。
我只会使用vector
来解决这两个问题。
std::vector<std::vector<float> > testArray(height, std::vector<float>(width));
答案 1 :(得分:3)
尝试初始化数组中的值:
float testArray[height][width] = {};
答案 2 :(得分:2)
这一行创建一个未初始化的数组,元素值可以是任何垃圾:
float testArray[height][width];
要使用浮点默认值(零)初始化它,请使用以下语法:
float testArray[height][width] = {};
答案 3 :(得分:2)
这个答案是错的,但我离开了,所以没有人想到它!
使用这个非常明确的定义:
float testArray[height][width] = {{0.0f}};
确保数组中的每个值都初始化为零。否则,数组中的值将是未定义的。我觉得这是最“可读”的解决方案。
为什么错?
正如@Dave在下面提到的那样,尽管这种解决方案适用于这种情况,但它具有误导性。它明确地将<{>仅testArray
的第一个元素赋予0.0,而value-initializes数组中的所有其他元素。
确实是正确的解决方案:
float testArray[height][width] = {};
将值初始化为数组中的所有元素(对于类型0.0f
的默认值float
。