2012-07-19 142 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 =部件材料規格初始化工會{...}工會則第一個成員被初始化。