2010-08-11 21 views
19

Tôi có bảng tra cứu như được định nghĩa bên dưới và tôi đang sử dụng GCC. Khi tôi biên dịch, tôi nhận được cảnh báo làcảnh báo gcc: niềng răng xung quanh bộ khởi tạo vô hướng

warning: braces around scalar initializer 

Cảnh báo này có ý nghĩa gì? Làm thế nào tôi nên khởi tạo LUT này? Tôi có mắc sai lầm khi khởi tạo cấu trúc này không?

Trợ giúp !!


typedef struct TECH 
{ 

    float velocity1, velocity2; 
    float temp; 
    float measure; 

    int id; 
    float storage[64]; 

}TECH; 

struct TECH lut_model_1[2] = {{{296.001465}, 
     {74.216972}, 
     {2.025908}, 
     {1.516384}, 
     {1}, 
     {0.001746, 
     0.000256, 0.006216, 0.005249, -0.001668, -0.001377, 0.009865, 0.010454, -0.000288, -0.005853, 0.010584, 0.015440, 0.000465, -0.000602, 0.004330, 0.005700, 0.017120, 
     0.233015, 0.034154, 0.244022, 0.007644, 0.385683, 0.042960, 0.406633, -0.007811, 0.346931, 0.040123, 0.387361, 0.007030, 0.225309, 0.017897, 0.241024, 0.003700, 
     0.103601, 0.060748, 0.121059, -0.045041, 0.076974, 0.070647, 0.148810, -0.022399, 0.074007, 0.054797, 0.141794, 0.010376, 0.052482, 0.045013, 0.078443, -0.019940, 
     -0.057353, 0.044285, 0.066622, -0.058232, -0.093817, 0.064753, 0.126611, -0.008286, -0.085634, 0.029582, 0.140443, 0.009189, -0.052974, 0.036057, 0.087536}}, 

     {{309.270569}, 
     {74.520226}, 
     {2.088673}, 
     {1.595730}, 
     {1}, 
     {-0.003261, 
     0.001452, 0.006673, 0.007092, 0.001020, 0.002904, 0.009037, 0.009587, -0.001494, 0.000296, 0.009327, 0.010013, -0.000301, -0.002727, 0.005875, 0.008888, -0.016850, 
     0.231185, 0.029758, 0.241629, 0.009411, 0.382748, 0.057553, 0.407984, -0.019496, 0.393691, 0.045355, 0.411033, -0.019787, 0.185746, 0.027101, 0.216863, 0.010189, 
     0.050463, 0.041380, 0.059462, 0.009747, 0.093188, 0.089831, 0.132579, -0.049612, 0.058789, 0.075130, 0.122026, -0.022185, 0.017041, 0.035450, 0.074255, -0.002068, 
     -0.061219, 0.040752, 0.087084, -0.013021, -0.106098, 0.066566, 0.140099, -0.041966, -0.073433, 0.055231, 0.125908, -0.003481, -0.050690, 0.017257, 0.085251}}}; 
+0

Tôi gặp vấn đề tương tự, chỉ tôi bị kẹt với ERROR. "lỗi: dấu ngoặc ôm xung quanh trình khởi tạo vô hướng cho loại 'float'". Tôi sẽ rất vui nếu tôi biết làm thế nào để thực hiện điều này một cảnh báo trình biên dịch, như mã tôi cần phải biên dịch không phải là của tôi để chỉnh sửa. – user297500

+0

@ user297500, khởi tạo với '0.f' –

Trả lời

16

Bạn nên loại bỏ các dấu ngoặc: {} xung quanh giá trị duy nhất.

struct TECH lut_model_1[2] = {{296.001465, 
     74.216972, 
     2.025908, 
     1.516384, 
     1, 
     {0.001746, 
     0.000256, 0.006216, 0.005249, -0.001668, -0.001377, 0.009865, 0.010454, -0.000288, -0.005853, 0.010584, 0.015440, 0.000465, -0.000602, 0.004330, 0.005700, 0.017120, 
     0.233015, 0.034154, 0.244022, 0.007644, 0.385683, 0.042960, 0.406633, -0.007811, 0.346931, 0.040123, 0.387361, 0.007030, 0.225309, 0.017897, 0.241024, 0.003700, 
     0.103601, 0.060748, 0.121059, -0.045041, 0.076974, 0.070647, 0.148810, -0.022399, 0.074007, 0.054797, 0.141794, 0.010376, 0.052482, 0.045013, 0.078443, -0.019940, 
     -0.057353, 0.044285, 0.066622, -0.058232, -0.093817, 0.064753, 0.126611, -0.008286, -0.085634, 0.029582, 0.140443, 0.009189, -0.052974, 0.036057, 0.087536}}, 

     {309.270569, 
     74.520226, 
     2.088673, 
     1.595730, 
     1, 
     {-0.003261, 
     0.001452, 0.006673, 0.007092, 0.001020, 0.002904, 0.009037, 0.009587, -0.001494, 0.000296, 0.009327, 0.010013, -0.000301, -0.002727, 0.005875, 0.008888, -0.016850, 
     0.231185, 0.029758, 0.241629, 0.009411, 0.382748, 0.057553, 0.407984, -0.019496, 0.393691, 0.045355, 0.411033, -0.019787, 0.185746, 0.027101, 0.216863, 0.010189, 
     0.050463, 0.041380, 0.059462, 0.009747, 0.093188, 0.089831, 0.132579, -0.049612, 0.058789, 0.075130, 0.122026, -0.022185, 0.017041, 0.035450, 0.074255, -0.002068, 
     -0.061219, 0.040752, 0.087084, -0.013021, -0.106098, 0.066566, 0.140099, -0.041966, -0.073433, 0.055231, 0.125908, -0.003481, -0.050690, 0.017257, 0.085251}}}; 

sẽ không cảnh báo.

3

Điều này có nghĩa bạn không cần phải đặt dấu ngoặc ở những nơi như:

{74.216972}, 

Về cơ bản, tất cả các niềng răng bạn có ở đó là không bắt buộc (ngoại trừ những bên ngoài), tuy nhiên, bạn sẽ nhận được một cảnh báo khác nhau cho không bao gồm các cấu trúc lồng nhau trong bộ khởi tạo. Về cơ bản, nếu bạn nhớ cảnh báo, đặt niềng răng xung quanh cấu trúc lồng nhau và mảng chỉ; nếu không, hãy sử dụng chúng để cải thiện khả năng đọc như bạn muốn.

2

Bạn khởi tạo giá trị vô hướng (vận tốc1, tạm thời, vv) bằng cách bao quanh chúng bằng niềng răng, không cần thiết.

Hãy thử điều này:

struct TECH lut_model_1[2] = {{296.001465, 
     74.216972, 
     2.025908, 
     1.516384, 
     1, 
     {0.001746, 
     0.000256, 0.006216, 0.005249, -0.001668, -0.001377, 0.009865, 0.010454, -0.000288, -0.005853, 0.010584, 0.015440, 0.000465, -0.000602, 0.004330, 0.005700, 0.017120, 
     0.233015, 0.034154, 0.244022, 0.007644, 0.385683, 0.042960, 0.406633, -0.007811, 0.346931, 0.040123, 0.387361, 0.007030, 0.225309, 0.017897, 0.241024, 0.003700, 
     0.103601, 0.060748, 0.121059, -0.045041, 0.076974, 0.070647, 0.148810, -0.022399, 0.074007, 0.054797, 0.141794, 0.010376, 0.052482, 0.045013, 0.078443, -0.019940, 
     -0.057353, 0.044285, 0.066622, -0.058232, -0.093817, 0.064753, 0.126611, -0.008286, -0.085634, 0.029582, 0.140443, 0.009189, -0.052974, 0.036057, 0.087536}}, 

     {309.270569, 
     74.520226, 
     2.088673, 
     1.595730, 
     1, 
     {-0.003261, 
     0.001452, 0.006673, 0.007092, 0.001020, 0.002904, 0.009037, 0.009587, -0.001494, 0.000296, 0.009327, 0.010013, -0.000301, -0.002727, 0.005875, 0.008888, -0.016850, 
     0.231185, 0.029758, 0.241629, 0.009411, 0.382748, 0.057553, 0.407984, -0.019496, 0.393691, 0.045355, 0.411033, -0.019787, 0.185746, 0.027101, 0.216863, 0.010189, 
     0.050463, 0.041380, 0.059462, 0.009747, 0.093188, 0.089831, 0.132579, -0.049612, 0.058789, 0.075130, 0.122026, -0.022185, 0.017041, 0.035450, 0.074255, -0.002068, 
     -0.061219, 0.040752, 0.087084, -0.013021, -0.106098, 0.066566, 0.140099, -0.041966, -0.073433, 0.055231, 0.125908, -0.003481, -0.050690, 0.017257, 0.085251}}}; 
5

Đây là một initializer vô hướng: int foo = 3;
Đây là một initializer vô hướng với niềng răng xung quanh nó: int foo = {3};
Đây là một khởi tạo của một mảng, mà không phải là vô hướng: int foo[] = {1, 2, 3};

cảnh báo nói rằng struct của bạn có initializers vô hướng với niềng răng xung quanh họ:

typedef struct TECH 
{ 

    float velocity1, velocity2; 
... 

struct TECH lut_model_1[2] = {{{296.001465}, 
    {74.216972}, 
... 

Mã của bạn sẽ hoạt động, nó chỉ có các dấu ngoặc thừa thừa xung quanh bộ khởi tạo vô hướng của nó. Nếu bạn lấy niềng răng ra và định dạng nó một chút độc đáo hơn (tôi muốn đặt initializer đầu tiên trên dòng riêng của mình) sẽ không có gì đáng phản đối về nó.

16

Trong ngôn ngữ C nó là hoàn toàn hợp pháp để sử dụng niềng răng thêm khi khởi tạo một giá trị vô hướng, như trong

int x = { 5 }; 

mặc dù bạn sẽ không thường thấy điều này trong mã thực tế cuộc sống. Trong trường hợp của bạn, bạn đang làm điều tương tự, ngoại trừ trong trường hợp của bạn giá trị vô hướng là một thành viên của một tổng hợp lớn hơn.

GCC tạo cảnh báo cho mã như thế. Nó tin rằng bạn có thể viết một cái gì đó bạn không có ý định để viết, vì hầu hết thời gian được sử dụng để bắt đầu một bộ khởi tạo đa phần cho một tổng hợp, không phải là một bộ khởi tạo độc lập cho một vô hướng.

<rant> GCC chắc chắn đang vặn vẹo mọi thứ bằng cảnh báo về dấu ngoặc trong trình khởi tạo tổng hợp. Trong ngôn ngữ C, { 0 } luôn được sử dụng như một bộ khởi tạo số không thành ngữ.Ít nhất { 0 } nên đã được thực hiện miễn cảnh báo liên quan đến cú đúp cho giá trị thành ngữ của nó. </rant>

+0

Điều này có nghĩa là' {0} 'cũng phải là trình khởi tạo hợp pháp hoàn hảo cho tập hợp có thành viên đầu tiên là tổng hợp khác không? – jamesdlin

+2

@jamesdlin: Có. Không cần phải mở một cấp độ chuyên dụng '{}' cho mỗi tập hợp lồng nhau. GCC sẽ đưa ra một cảnh báo mặc dù - một nơi khác mà họ quản lý để phá vỡ '{0}' thành ngữ với cảnh báo gây phiền nhiễu. – AnT

+0

Điều này làm phiền tôi quá. Tôi tiếp tục nhận được cảnh báo cho vô số các tình huống mà tôi muốn một cấu trúc được khởi tạo bằng không với '= {0};' và nó rên rỉ. Họ nên tạo một trường hợp đặc biệt cho '= {0}; 'và giảm bớt các cảnh báo. –