inicialización de matriz de estructura c

4 minutos de lectura

avatar de usuario
Hemán

tengo estructura

struct ABC {
  int a; 
  int b;
}

y matriz de ella como

struct ABC xyz[100];

Quiero inicializarlo a = 10 yb = 20; para todos los elementos de la matriz.

¿Cuál es mejor manera?

  • ¿Escribir un bucle? ¿Cuál es el problema?

    -Guntram Blohm

    3 de febrero de 2014 a las 13:13

  • escribe 100 veces en tu código!

    –Grijesh Chauhan

    3 de febrero de 2014 a las 13:16

  • Extensión CCG: struct ABC xyz[100] = {[0 ... 99] = {10, 20}};

    – PIXY AZUL

    3 de febrero de 2014 a las 13:47


Si bien no existe una manera particularmente elegante de inicializar una gran matriz como esta en C, es posible. Tú no tiene que hacerlo en tiempo de ejecución, como afirman falsamente algunas respuestas. Y tú no quiero para hacerlo en tiempo de ejecución, supongamos que la matriz es const?

La forma en que lo hago es definiendo una serie de macros:

struct ABC {
  int a; 
  int b;
};

#define ABC_INIT_100 ABC_INIT_50 ABC_INIT_50
#define ABC_INIT_50  ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10 ABC_INIT_10
#define ABC_INIT_10  ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2 ABC_INIT_2
#define ABC_INIT_2   ABC_INIT_1 ABC_INIT_1
#define ABC_INIT_1   {10, 20},

int main()
{
  struct ABC xyz[100] =
  {
    ABC_INIT_100
  };
}

Tenga en cuenta que las macros como estas se pueden combinar de cualquier forma para realizar cualquier número de inicializaciones. Por ejemplo:

#define ABC_INIT_152 ABC_INIT_100 ABC_INIT_50 ABC_INIT_2

avatar de usuario
relajarse

Con GCC puedes usar su sintaxis extendida y hacer:

struct ABC xyz[100] = { [0 ... 99].a = 10, [0 ... 99].b = 20 };

Para una solución portátil, probablemente inicializaría una instancia y usaría un bucle para copiar esa instancia al resto:

struct ABC xyz[100] = { [0].a = 10, [0].b = 20 };

for(size_t i = 1; i < sizeof xyz / sizeof *xyz; ++i)
  xyz[i] = xyz[0];

Esto es algo más limpio para mí que tener los valores reales en el bucle. Se puede decir que expresa el resultado deseado en un ligeramente más alto nivel.

La sintaxis anterior ([0].a y [0].b) es no una extensión, es típico C99.

  • La versión portátil estrictamente hablando no inicialización, pero asignación de tiempo de ejecución. ¿Cómo harías eso si xyz fuera const?

    – Lundin

    3 de febrero de 2014 a las 14:44

  • @Lundin Cierto, por supuesto, como todas las demás sugerencias de bucle. No creo que se pueda hacer con constsin un gran inicio explícito o macros (como su respuesta).

    – relajarse

    3 de febrero de 2014 a las 14:53


  • @lundin por otro lado, ¿cómo usaría las macros si la matriz en cuestión estuviera asignada en la pila dentro de una función y el tamaño de la matriz fuera un argumento de función? Puede hacer que cualquier respuesta no se aplique agregando requisitos adicionales, pero no hay indicios de que el OP estuviera buscando una matriz constante; Dada la naturaleza de la pregunta, es más probable que simplemente estuviera buscando una manera de evitar escribir mucho (lo que proporcionan tanto su solución como las soluciones basadas en bucles). Si bien no es estrictamente inicialización, es es lo que la mayoría de la gente quiere decir con el término cuando habla casualmente.

    – JVMATL

    03/02/2014 a las 18:27

  • Además, fwiw, me gusta que esta versión capture mejor la intención de establecer todos los elementos en el mismo valor predeterminado, y no se rompe si el tamaño de la matriz cambia (o es dinámico).

    – JVMATL

    3 de febrero de 2014 a las 18:29

  • @JVMATL Los VLA de alcance local se asignan en tiempo de ejecución, por lo que no hay ningún beneficio de usar la inicialización en lugar de la asignación. La diferencia entre inicialización y asignación solo importa cuando se habla de los valores predeterminados de las variables, que se pueden determinar en tiempo de compilación.

    – Lundin

    4 de febrero de 2014 a las 7:28

for(unsigned int i=0; i<100; i++)
{
    xyz[i].a = 10;
    xyz[i].b = 20;
}

  • Esto no es estrictamente hablando inicialización, pero asignación de tiempo de ejecución. ¿Cómo harías eso si xyz fuera const?

    – Lundin

    03/02/2014 a las 14:45

  • @Lundin ¿Por qué necesitaría más de 1 copia de los mismos valores, entonces?

    – Valiente Sir Robin

    3 de febrero de 2014 a las 14:46

  • @rmartinjak Eso dependería completamente de la naturaleza de la aplicación. Supongamos que existe un escenario donde todos los valores son individuales y otro donde todos son iguales. Luego usa la matriz const como entrada para una función.

    – Lundin

    3 de febrero de 2014 a las 14:48

avatar de usuario
JVMATL

No hay soporte de lenguaje explícito para inicializar todos los elementos en una matriz de subestructuras a valores predeterminados específicos distintos de cero, de la misma manera que hay para inicializar todos los elementos a cero; tiene que inicializar cada elemento explícitamente en la fuente en tiempo de compilación o tiene que escribir un bucle for() e inicializar cada elemento al inicio.

Como señala el usuario @lundin en otra respuesta, puede usar macros de preprocesador para reducir la escritura involucrada en la inicialización explícita de esos valores, pero en lo que respecta al compilador de C, todavía está inicializando cada elemento explícitamente.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad