2012-07-19 25 views
6

Tôi đang cố gắng để khởi tạo mảng công đoàn sau tại tuyên bố:khởi tạo một mảng công đoàn tại khai

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

Nhưng I'getting các lỗi sau:

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

Trả lời

11

Trích dẫn 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.

Vì vậy, trước tiên hãy đặt float mảng hoặc nếu có thể, hãy sử dụng C99 và viết:

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

Điều quan trọng là .f.

+0

Có cần phải có một tập hợp các dấu ngoặc ôm xung quanh toàn bộ biểu thức '.f = {...}'. – cdhowie

+0

@cdhowie Cảm ơn, lỗi đánh máy. Đã sửa. – unwind

+0

Giải pháp làm sạch đã chuyển tờ khai nổi đến vị trí đầu tiên. Điều này làm cho việc sử dụng không cần thiết ".f" và nó biên dịch mà không có lỗi. Cảm ơn. – albertgumi

2

Bạn cần chỉ định trường liên kết nào bạn đang khởi tạo. Hãy thử sử dụng cú pháp này:

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

Đã biên soạn thành công cho tôi mà không có cảnh báo nào.

0

Cố gắng thay đổi thành viên:

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

Nếu bạn khởi công đoàn mà không đặc điểm kỹ thuật viên như .f = {...} thành viên thì trước tiên của công đoàn được khởi tạo.

Các vấn đề liên quan