2012-07-19 24 views
6

sto cercando di inizializzare il seguente array sindacato dichiarazione:inizializzare un array di sindacato dichiarazione

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

Ma I'getting il seguente errore:

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

risposta

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.

Quindi, inserire prima l'array float oppure, se possibile, usare C99 e scrivere:

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

La cosa importante è la .f.

+0

Deve esserci anche un insieme di parentesi graffe attorno all'intera espressione '.f = {...}'. – cdhowie

+0

@cdhowie Grazie, errore di battitura. Fisso. – unwind

+0

La soluzione più pulita stava spostando la dichiarazione float nella prima posizione. Questo rende inutile l'uso di ".f" e si compila senza errori. Grazie. – albertgumi

2

È necessario indicare quale campo unione si sta inizializzando. Provare a utilizzare questa sintassi:

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

Questo compilato con successo per me, senza avvisi.

0

cercare di cambiare i membri:

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

Se si inizializza l'unione senza specificazione membro come .f = {...} allora primo membro dell'unione viene inizializzato.

Problemi correlati