5

我正在编写一个创建浮点数组数组副本的方法。调试后我得到了一些非常奇怪的值,所以我想我会问这个问题,因为我无法通过阅读 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;
        }
    }
}

(在我的测试中,高度 = 32 和宽度 = 256,但这不应该是相关的。)当我初始化 testArray 时,它的值应该都是 0.0,对吗?然后,在循环中,我从 testArray 中的某个元素中减去 0.0,这在逻辑上根本不应该改变值。但是打印 testArray 的值作为调试步骤会导致一些奇怪的值,例如以下代码段:

[...]
0
[...]
-3.23805e-24
[...]
8.40779e-45
[...]
1.79513e+37
[...]
0
[...]
3.19586e+36
[...]

最令人担忧的值是无穷大的,例如上面列出的第四个数字。老实说,我不知道为什么会这样。所有这些值不应该仍然约为 0.0 吗?我认为这与浮点运算的不精确有关,但这不应该导致无限值....

4

4 回答 4

7

不,当您这样声明数组时,它将未初始化,因为它是内置类型。在进行减法之前,您需要自己将其初始化为零。

但请注意,声明一个数组(可能是非常量维度)是编译器扩展,而不是语言的一部分。

我只会使用vector同时解决这两个问题的方法。

std::vector<std::vector<float> > testArray(height, std::vector<float>(width));
于 2012-11-19T20:51:32.487 回答
3

尝试初始化数组中的值:

float testArray[height][width] = {};
于 2012-11-19T20:52:21.127 回答
2

这一行创建了一个未初始化的数组,元素值可以是任何垃圾:

float testArray[height][width];

要使用浮点默认值(零)对其进行初始化,请使用以下语法:

float testArray[height][width] = {};
于 2012-11-19T20:53:19.200 回答
2

这个答案是错误的,但我没有人尝试它!

使用这个非常明确的定义:

float testArray[height][width] = {{0.0f}};

确保数组中的每个值都初始化为零。否则,数组中的值将是未定义的。我觉得这是最“可读”的解决方案。

为什么错了?

正如@Dave 在下面提到的,尽管此解决方案适用于这种情况,但它具有误导性。它仅将 的第一个元素显式分配testArray给 0.0,同时对数组中的所有其他元素进行值初始化。

正确的解决方案确实是:

float testArray[height][width] = {};

它对数组中的所有元素进行值初始化(0.0f为 type的默认值float

于 2012-11-19T20:54:07.083 回答