programacion - ¿La forma más rápida de inicializar una matriz de estructuras a todos los 0?
vectores en c (6)
Estoy tratando de inicializar una matriz de estructuras a todos-0, usando la siguiente sintaxis:
STRUCTA array[MAX] = {0};
Sin embargo, estoy recibiendo la siguiente advertencia de gcc:
advertencia: faltan llaves alrededor del inicializador
¿Qué estoy haciendo mal? ¿Hay otra / mejor manera de hacer esto?
¿Se puede asignar STRUCTA a 0?
Siempre puedes usar memset (), también.
Depende de la estructura. Por ejemplo :
typedef struct structa
{
int a, b;
} STRUCTA;
int main (int argc, char const* argv[])
{
STRUCTA array[10] = {{0,0}};
return 0;
}
Esto es simplemente una advertencia dañina emitida por gcc, y la deshabilitaría con -Wno-braces
. {0}
es un "inicializador universal de cero" extremadamente útil para los tipos cuya definición se supone que su código no debe tener en cuenta, y el hecho de que gcc desaliente su uso es activamente perjudicial para la búsqueda de un buen código.
Si gcc desea mantener esta advertencia, debería al menos un caso especial {0}
y deshabilitar la advertencia en este caso.
Las matrices se inicializan con llaves, pero también lo son las estructuras. Probablemente deba colocar un juego adicional de llaves alrededor de su 0 y, según la STRUCTA
, algunos 0 adicionales separados por comas.
Si el primer miembro de su estructura tiene un tipo escalar, use
STRUCTA array[MAX] = {{ 0 }};
Si el primer miembro de su estructura es otro objeto de estructura, cuyo primer miembro tiene tipo escalar, entonces tendrá que usar
STRUCTA array[MAX] = {{{ 0 }}};
y así. Básicamente, debe abrir un nuevo nivel de {}
anidado cada vez que "ingrese" otro agregado anidado (una estructura o una matriz). Entonces, en este caso, siempre que el primer miembro de cada agregado anidado también sea un agregado, debe profundizar con {}
.
Todas estas llaves adicionales están solamente allí para evitar la advertencia. Por supuesto, esto es solo una advertencia inofensiva (en este caso específico). Puedes usar un { 0 }
simple y funcionará.
Probablemente, la mejor manera de lidiar con esto es desactivar esta advertencia por completo (consulte la respuesta de @ pmg para obtener la opción de línea de comando correcta). Alguien que trabajaba en GCC no estaba pensando con claridad. Quiero decir, entiendo el valor de esa advertencia (y puede ser muy útil), pero romper la funcionalidad de { 0 }
es inaceptable. { 0 }
debería haber recibido un tratamiento especial.
gcc está siendo una molestia. Se debe aceptar que sin advertencias.
Prueba esto
STRUCTA array[MAX] = {{0}};
Ese comportamiento de gcc se puede controlar con la opción -Wmissing-braces
o -Wno-missing-braces
.
-Wall
habilita esta advertencia; para tener -Wall
pero no las llaves faltantes, use -Wall -Wno-missing-braces