5

宣言時に次のユニオン配列を初期化しようとしています:

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

しかし、次のエラーが発生します。

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

3 に答える 3

14

このページを引用:

C89 スタイルの初期化子では、宣言された順序で構造体メンバーを初期化する必要があり、共用体の最初のメンバーのみを初期化できます。

したがって、float最初に配列を配置するか、可能であれば C99 を使用して次のように記述します。

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

重要なのは.f.

于 2012-07-19T10:06:13.200 に答える
3

初期化する共用体フィールドを示す必要があります。次の構文を使用してみてください。

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

これは、警告なしで正常にコンパイルされました。

于 2012-07-19T10:07:15.740 に答える
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 = { ... } のようなメンバー指定なしで共用体を初期化すると、共用体の最初のメンバーが初期化されます。

于 2012-07-19T11:58:46.070 に答える