初始化在声明
问题描述:
我想下面的工会阵列在声明初始化数组工会:初始化在声明
typedef union { __m128d m; float f[4]; } mat;
mat m[2] = { {{30467.14153,5910.1427,15846.23837,7271.22705},
{30467.14153,5910.1427,15846.23837,7271.22705}}};
但I'getting以下错误:
matrix.c: In function ‘main’:
matrix.c:21: error: incompatible types in initialization
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[0]’)
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[0]’)
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[0]’)
matrix.c:21: error: incompatible types in initialization
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[1]’)
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[1]’)
matrix.c:21: warning: excess elements in union initializer
matrix.c:21: warning: (near initialization for ‘m[1]’)
答
报价this page:
With C89-style initializers, structure members must be initialized in the order declared, and only the first member of a union can be initialized.
因此,要么首先将float
数组,或者如果可能的话使用C99和写:
mat m[2] = { { .f = { /* and so on */ } }, /* ... */ };
重要的是.f
。
答
您需要指出您正在初始化哪个联合字段。尝试使用此语法:
mat m[2] = {
{.f = {30467.14153,5910.1427,15846.23837,7271.22705}},
{.f = {30467.14153,5910.1427,15846.23837,7271.22705}}
};
这成功编译为我,没有任何警告。
答
尝试改变成员:
typedef union {
float f[4];
__m128d m;
} mat;
mat m[2] = { { {30467.14153,5910.1427,15846.23837,7271.22705},
{30467.14153,5910.1427,15846.23837,7271.22705} } };
如果你不喜欢.F =部件材料规格初始化工会{...}工会则第一个成员被初始化。
在整个'.f = {...}'表达式中,还需要有一组大括号。 – cdhowie 2012-07-19 10:07:43
@cdhowie谢谢,错字。固定。 – unwind 2012-07-19 10:09:15
更清洁的解决方案是将浮动申报移到第一个位置。这使得不必要的使用“.f”,它编译没有错误。谢谢。 – albertgumi 2012-07-19 10:31:01