2012-07-19 109 views
6

我想下面的工会阵列在声明初始化数组工会:初始化在声明

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]’) 

回答

11

报价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

+0

在整个'.f = {...}'表达式中,还需要有一组大括号。 – cdhowie 2012-07-19 10:07:43

+0

@cdhowie谢谢,错字。固定。 – unwind 2012-07-19 10:09:15

+0

更清洁的解决方案是将浮动申报移到第一个位置。这使得不必要的使用“.f”,它编译没有错误。谢谢。 – albertgumi 2012-07-19 10:31:01

2

您需要指出您正在初始化哪个联合字段。尝试使用此语法:

mat m[2] = { 
    {.f = {30467.14153,5910.1427,15846.23837,7271.22705}}, 
    {.f = {30467.14153,5910.1427,15846.23837,7271.22705}} 
}; 

这成功编译为我,没有任何警告。

0

尝试改变成员:

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 =部件材料规格初始化工会{...}工会则第一个成员被初始化。