c lookup-tables gcc-warning

Advertencia gcc: llaves alrededor del inicializador escalar



lookup-tables gcc-warning (5)

Debe eliminar las llaves: { y } alrededor de 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á ninguna advertencia.

Tengo una tabla de consulta como se define a continuación y estoy haciendo uso de GCC. Cuando compilo me sale advertencias como

warning: braces around scalar initializer

¿Qué significa esta advertencia? ¿Cómo debo inicializar esta LUT? ¿Estoy cometiendo un error 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}}};


En lenguaje C, es perfectamente legal usar llaves adicionales al inicializar un valor escalar, como en

int x = { 5 };

aunque normalmente no verá esto en el 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 más grande.

GCC genera advertencias para código como ese. Cree que es posible que hayas escrito algo que no pretendías escribir, ya que la mayoría de las veces se utilizan llaves para iniciar un inicializador de varias partes para un agregado, no un inicializador independiente para un escalar.

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


Este es un inicializador escalar: int foo = 3;
Este es un inicializador escalar con llaves alrededor de él: 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 llaves alrededor de ellos:

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 tirantes y los formateas un poco más bien (yo pondría el primer inicializador en su propia línea) no habrá nada objetable al respecto.


Esto significa que no es necesario poner llaves en lugares como:

{74.216972},

Básicamente, todas las llaves que tiene allí son opcionales (excepto las externas), sin embargo, recibirá una advertencia diferente por no aceptar estructuras anidadas en el inicializador. Básicamente, si le molesta la advertencia, coloque llaves solo alrededor de estructuras y arreglos anidados; Si no, utilízalos para mejorar la legibilidad como quieras.


Inicializa los valores escalares (velocidad1, temperatura, etc.) al rodearlos con llaves, que no son necesarios.

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