2010-08-11 8 views
19

Tengo una tabla de búsqueda como se define a continuación y estoy haciendo uso de GCC. Cuando compilo obtengo advertencias comoadvertencia de gcc: llaves alrededor del inicializador escalar

warning: braces around scalar initializer 

¿Qué significa esta advertencia? ¿Cómo debo inicializar esta LUT? ¿Me estoy equivocando al inicializar estas estructuras?

¡Ayuda!


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

Tengo el mismo problema, solo que estoy atascado con un ERROR. "error: llaves alrededor del inicializador escalar para el tipo 'float'". Me alegraría si supiera cómo hacer de esto una advertencia para el compilador, ya que el código que necesito compilar no es mío para editar. – user297500

+0

@ user297500, inicializar con '0.f' –

Respuesta

16

Es preciso retirar las llaves: { y } torno a los valores individuales.

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

no darán aviso.

3

Esto significa que no es necesario poner los frenos en lugares como:

{74.216972}, 

Básicamente, todos los apoyos que tiene allí son opcionales (excepto los exteriores), sin embargo, obtendrá una advertencia diferente para no abrazar estructuras anidadas en el inicializador. Básicamente, si le importa la advertencia, coloque llaves alrededor de las estructuras y matrices anidadas solamente; si no, úsalos para mejorar la legibilidad a tu gusto.

2

Inicializa los valores escalares (velocity1, temp, etc.) rodeándolos con llaves, que no es necesario.

Prueba esto:

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

Este es un inicializador escalar: int foo = 3;
Este es un inicializador escalar con los apoyos alrededor de ella: int foo = {3};
Este es un inicializador de una matriz, que no es escalar: int foo[] = {1, 2, 3};

La advertencia dice que su estructura tiene inicializadores escalares con los apoyos que les rodean:

typedef struct TECH 
{ 

    float velocity1, velocity2; 
... 

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

Su código funcionará, solo tiene llaves superfluas alrededor de sus inicializadores escalares. Si quitas los frenos y lo formateas un poco mejor (pondré el primer inicializador en su propia línea) no habrá nada objetable al respecto.

16

En el lenguaje C es perfectamente legal el uso de los apoyos adicionales al inicializar un valor escalar, como en

int x = { 5 }; 

a pesar de que normalmente no se vea esto en código de la vida real. En su caso, usted está haciendo lo mismo, excepto que en su caso el valor escalar es un miembro de un agregado mayor.

GCC genera advertencias para este tipo de código. Cree que es posible que haya escrito algo que no tenía la intención de escribir, ya que las llaves se utilizan la mayoría de las veces para iniciar un inicializador de varias partes para un agregado, no como un inicializador independiente para un escalar.

<rant> GCC definitivamente está arruinando las cosas con sus advertencias sobre llaves en los inicializadores agregados. En lenguaje C, el { 0 } siempre se ha utilizado como un inicializador de cero universal idiomático.Al menos { 0 } debería haberse hecho exento de las advertencias relacionadas con los refuerzos por su valor idiomático. </rant>

+0

¿Esto significa que' {0} 'también debería ser un inicializador perfectamente legal para un agregado cuyo primer miembro es otro agregado? – jamesdlin

+2

@jamesdlin: Sí. No es necesario abrir un nivel dedicado de '{}' para cada agregado anidado. Sin embargo, GCC emitirá una advertencia: otro lugar donde lograron romper el modismo '{0}' con advertencias molestas. – AnT

+0

Esto también me molesta. Sigo recibiendo advertencias para muchas situaciones en las que quiero que una estructura se inicie a cero con '= {0};' y gime. Deberían hacer un caso especial para '= {0};' y facilitar las advertencias. –

Cuestiones relacionadas