2010-08-11 15 views
19

Ho una tabella di controllo come definito di seguito e sto facendo uso di GCC. Quando compilo ricevo avvisi comeAvviso gcc: parentesi attorno all'inizializzatore scalare

warning: braces around scalar initializer 

Cosa significa questo avviso? Come dovrei inizializzare questo LUT? Sto commettendo un errore nell'inizializzare queste strutture?

Aiuto !!


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

Ho lo stesso problema, solo che sono bloccato con un errore. "errore: rinforza l'inizializzatore scalare per il tipo 'float'". Sarei felice se sapessi come rendere questo un avvertimento del compilatore, poiché il codice che ho bisogno di compilare non è il mio da modificare. – user297500

+0

@ user297500, inizializza con '0.f' –

risposta

16

È necessario rimuovere le parentesi: { e } intorno a valori singoli.

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

non darà alcun avviso.

3

Questo significa che non è necessario mettere tra parentesi graffe in luoghi come:

{74.216972}, 

In sostanza, tutte le coppie che avete non vi sono opzionali (ad eccezione di quelli esterni), tuttavia, si otterrà un messaggio di avviso diverso per non abbracciando le strutture annidate nell'inizializzatore. In sostanza, se ti preoccupi dell'avvertimento, metti le parentesi solo attorno a strutture e array annidati; in caso contrario, usali per migliorare la leggibilità a tuo piacimento.

2

Si inizializzano i valori scalari (velocity1, temp, ecc.) Circondandoli con parentesi, che non è necessario.

Prova questo:

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

Questo è un inizializzatore scalare: int foo = 3;
Questo è un inizializzatore scalare con bretelle circonda: int foo = {3};
Questo è un inizializzatore di una matrice, che non è scalare: int foo[] = {1, 2, 3};

L'avviso dice che la vostra struttura ha inizializzatori scalari con bretelle che li circonda:

typedef struct TECH 
{ 

    float velocity1, velocity2; 
... 

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

Il tuo codice funzionerà, ha solo bretelle superflue attorno ai suoi inizializzatori scalari. Se togli le bretelle e la formatthi un po 'più bene (metterei il primo inizializzatore su una riga separata) non ci sarà nulla di discutibile a riguardo.

16

in linguaggio C è perfettamente legale usare le parentesi extra quando l'inizializzazione di un valore scalare, come in

int x = { 5 }; 

anche se non sarà normalmente vedere questo in codice di vita reale. Nel tuo caso stai facendo la stessa cosa, tranne che nel tuo caso il valore scalare è un membro di un aggregato più grande.

GCC genera avvisi per codice come quello. Ritiene che sia possibile che tu abbia scritto qualcosa che non avevi intenzione di scrivere, dal momento che le coppie vengono utilizzate per la maggior parte del tempo per avviare un inizializzatore multiparte per un aggregato, non un inizializzatore standalone per uno scalare.

<rant> GCC sta sicuramente mettendo le cose in chiaro con le sue avvertenze su coppie di inizializzatori aggregati. In linguaggio C lo { 0 } è sempre stato usato come inizializzatore universale idiota dello zero.Almeno { 0 } avrebbe dovuto essere escluso dagli avvertimenti relativi alle parentesi graffe per il suo valore idiomatico. </rant>

+0

Ciò significa che anche' {0} 'dovrebbe essere un inizializzatore perfettamente legale per un aggregato il cui primo membro è un altro aggregato? – jamesdlin

+2

@jamesdlin: Sì. Non è necessario aprire un livello dedicato di '{}' per ogni aggregato annidato. GCC rilascerà un avvertimento - un altro posto dove sono riusciti a rompere l'idioma '{0}' con fastidiosi avvertimenti. – AnT

+0

Questo mi infastidisce anche. Continuo a ricevere avvertenze per un sacco di situazioni in cui voglio che una struttura venga inizializzata a zero con '= {0};' e geme. Dovrebbero creare un caso speciale per '= {0};' e alleviare gli avvertimenti. –

Problemi correlati