g++;声明多维双数组时发出警告 在我的C++程序中,我尝试初始化一个3×3×3数组的double,所有数组都是0。 在类头文件中,我声明了一个成员 double list[3][3][3];
当我打印出这个数组的内容时,我发现并不是所有条目都像我预期的那样是0。e、 g.列表[1][1][1]的值为4.03158e-321 因此,我手动将此数组初始化为构造函数中的所有0: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
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
因此,我的问题是:
double * firstElem=&list[0][0][0];
std::fill(firstElem, firstElem+27, 0.);
它将list
视为一个由27个double
s组成的一维数组,并用零填充它(有关该技巧的更多信息)
请注意,此参数也将在中进行简要处理
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[