Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
g++;声明多维双数组时发出警告 在我的C++程序中,我尝试初始化一个3×3×3数组的double,所有数组都是0。 在类头文件中,我声明了一个成员 double list[3][3][3];_C++_Multidimensional Array_G++ - Fatal编程技术网

g++;声明多维双数组时发出警告 在我的C++程序中,我尝试初始化一个3×3×3数组的double,所有数组都是0。 在类头文件中,我声明了一个成员 double list[3][3][3];

g++;声明多维双数组时发出警告 在我的C++程序中,我尝试初始化一个3×3×3数组的double,所有数组都是0。 在类头文件中,我声明了一个成员 double list[3][3][3];,c++,multidimensional-array,g++,C++,Multidimensional Array,G++,当我打印出这个数组的内容时,我发现并不是所有条目都像我预期的那样是0。e、 g.列表[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

当我打印出这个数组的内容时,我发现并不是所有条目都像我预期的那样是0。e、 g.列表[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
因此,我的问题是:

  • 为什么列表在 标题?
  • 我为什么会收到上述警告消息,以及如何消除它?
  • 我的编译器是g++(Ubuntu/Linaro 4.5.2-8ubuntu4)4.5.2,gcc版本为4.5.2(Ubuntu/Linaro 4.5.2-8ubuntu4)

  • 在头文件中,它没有初始化,只是声明了。如果性能不是原因,则内置类型(一般是POD)不会自动初始化为零(实际上,静态存储持续时间)(因为C++中的很多东西,初始化是OPT,只在需要时才支付)。
  • 该语法仅在初始化数组时有效,而该指令是赋值。这种语法可以在新的C++标准中使用更多的地方(以前是C++ 0x,现在C++ 11,因为它刚刚被批准)。 在我看来,解决问题的最快方法就是:

    double * firstElem=&list[0][0][0];
    std::fill(firstElem, firstElem+27, 0.);
    
    它将
    list
    视为一个由27个
    double
    s组成的一维数组,并用零填充它(有关该技巧的更多信息)

    请注意,此参数也将在中进行简要处理

  • 在头文件中,它没有初始化,只是声明了。如果性能不是原因,则内置类型(一般是POD)不会自动初始化为零(实际上,静态存储持续时间)(因为C++中的很多东西,初始化是OPT,只在需要时才支付)。
  • 该语法仅在初始化数组时有效,而该指令是赋值。这种语法可以在新的C++标准中使用更多的地方(以前是C++ 0x,现在C++ 11,因为它刚刚被批准)。 在我看来,解决问题的最快方法就是:

    double * firstElem=&list[0][0][0];
    std::fill(firstElem, firstElem+27, 0.);
    
    它将
    list
    视为一个由27个
    double
    s组成的一维数组,并用零填充它(有关该技巧的更多信息)


    请注意,此参数也被简要地处理为。

    为什么不使用
    memset
    或循环将值设置为零?

    为什么不使用
    memset
    或循环将值设置为零?

    在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中使用值初始化:

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

    对于POD类型的成员(double的数组是
    double
    ),上面的语法(
    list()
    )在初始值设定项列表中表示该成员要进行值初始化,这实际上意味着在C++03中所有值都将设置为0

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

    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中使用值初始化:

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

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

    我是否遗漏了什么,或者您是否可以不这样做

    class Class {
    public:
        double array[3][3][3];
    
        Class() : array() { }
    };
    

    是我错过了什么,还是你不能就这么做

    class Class {
    public:
        double array[3][3][3];
    
        Class() : array() { }
    };
    

    有一种更简单的方法。下面的C或C++中应该只用于初始化变量(即不是赋值):


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

    有一种更简单的方法。下面的C或C++中应该只用于初始化变量(即不是赋值):


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

    -1。这是错误的。你不能像这样使用
    std::fill
    来初始化3D数组。@Nawaz:在发布答案时,我忘记了演员阵容,现在我添加了演员阵容。即使这样也是错误的。事实上,现在更危险了,因为你现在会得到任何警告。它未定义的行为。@David:因为它将3D数组视为1D数组,这意味着,
    &firstElem[0]==&list[0][0][0]&firstElem[1]==&列表[0][0][1]&firstElem[2]==&list[0][0][2]
    但据我所知,标准无处保证
    &firstElem[3]==&list[0][1][0]
    。另外,请参阅本主题:@Nawaz:standard保证数组的内容位于连续内存中。它保证
    &list[1]
    在内存中紧跟在
    &list[0]
    之后,因此是的,它确实保证:
    (&list[0][0][0]+4)=&list[0][1][0]
    注意,它们都是同一对象
    list
    -1的子对象。这是错误的。你不能像这样使用
    std::fill
    来初始化3D数组。@Nawaz:在发布答案时,我忘记了演员阵容,现在我添加了演员阵容。即使这样也是错误的。事实上,现在更危险了,因为你现在会得到任何警告。它未定义的行为。@David:因为它将3D数组视为1D数组,这意味着,
    &firstElem[0]=&list[