g ++警告声明多维,双数组

时间:2011-08-23 16:58:18

标签: c++ multidimensional-array g++

在我的C ++程序中,我试图用全0来初始化一个3 * 3 * 3类型的double数组。 在类头文件中,我声明了一个成员

double list[3][3][3];

当我打印出这个数组的内容时,我发现并非所有条目都是0,正如我预期的那样。例如list [1] [1] [1]的值为4.03158e-321

因此我手动将此数组初始化为构造函数中的所有0:

list = {{{0,0,0},{0,0,0},{0,0,0}},
      {{0,0,0},{0,0,0},{0,0,0}},
      {{0,0,0},{0,0,0},{0,0,0}}};

这使我的程序工作,但是,我得到了编译器警告:

warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x

因此我的问题是

  1. 为什么列表在初始化后具有非零条目 头吗
  2. 为什么我会收到上述警告信息,以及如何摆脱它?
  3. 我的编译器是g ++(Ubuntu / Linaro 4.5.2-8ubuntu4)4.5.2,gcc版本4.5.2(Ubuntu / Linaro 4.5.2-8ubuntu4)

5 个答案:

答案 0 :(得分:5)

在C ++ 03中,您只能在定义数组时使用该初始化:

double list[3][3][3] = {{{0,0,0},{0,0,0},{0,0,0}},
                        {{0,0,0},{0,0,0},{0,0,0}},
                        {{0,0,0},{0,0,0},{0,0,0}}};

编译器警告说,根据当前标准,它不应接受您的代码,即使它能够通过应用即将出现的标准规则来处理它,其中{...}被称为外部 - 初始化

在这种特殊情况下,如果数组是成员并且您想将其初始化为全零,则可以在C ++ 0x中使用 value-initialization

struct test { 
   double list[3][3][3];
   test() : list()
   {}
};

对于POD类型的成员(double的数组是),初始化列表中的上述语法(list())表示该成员将被值初始化有效地意味着所有值都将设置为0

答案 1 :(得分:3)

我错过了什么,或者你不能做到

class Class {
public:
    double array[3][3][3];

    Class() : array() { }
};

答案 2 :(得分:2)

  1. 在标题中没有初始化,它只是声明了。如果它们不是全局变量(实际上,它具有静态存储持续时间),则由于性能原因,内置类型(以及一般POD中的更多内容)不会自动进行零初始化(因为C ++中的许多内容,初始化是一个选择加入,只有在需要时才支付费用。)

  2. 该语法仅在初始化数组时有效,而该指令是赋值。相反,该语法可用于新C ++标准中的更多位置(以前是C ++ 0x,现在是C ++ 11,因为它刚被批准)。

  3. 在我看来,解决问题的最快方法就是:

    double * firstElem=&list[0][0][0];
    std::fill(firstElem, firstElem+27, 0.);
    

    list视为27 double s的单维数组,并用零填充(有关该技巧的更多信息here)。

    请注意,此参数也会简要地处理到array FAQ

答案 3 :(得分:1)

有一种更简单的方法。以下内容适用于C或C ++,仅用于初始化变量(即不在赋值中):

double list[3][3][3] = {0};

{0}是一个特殊的初始值设定项,几乎可以将任何结构设置为全零。

答案 4 :(得分:0)

为什么不用memset或循环?

将值设置为零