2012-07-19 18 views
6

Estoy tratando de inicializar la siguiente matriz sindical en la declaración:inicializar una matriz de unión a la declaración

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}}}; 

Pero I'getting el siguiente error:

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

Respuesta

11

Citando 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.

Por lo tanto, coloque primero la matriz float o, si es posible, use C99 y escribir:

mat m[2] = { { .f = { /* and so on */ } }, /* ... */ }; 

Lo importante es el .f.

+0

Tiene que haber un conjunto de llaves alrededor de toda la expresión '.f = {...}' también. – cdhowie

+0

@cdhowie Gracias, error tipográfico. Fijo. – unwind

+0

La solución de limpieza estaba moviendo la declaración de flotación a la primera posición. Esto hace un uso innecesario ".f" y se compila sin errores. Gracias. – albertgumi

2

Debe indicar qué campo de unión está inicializando. Intente utilizar esta sintaxis:

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

Esto compilado con éxito para mí, sin ningún tipo de advertencias.

0

tratar de cambiar los miembros:

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} } }; 

Si inicializa unión sin especificación miembro como .f = {...} entonces primer miembro de unión es inicializado.

Cuestiones relacionadas