Inicializadores designados en C

El estándar C90 requiere que los elementos de un inicializador aparezcan en un orden fijo, el mismo que el orden de los elementos en la array o estructura que se inicializa.
En ISO C99 puede dar los elementos en orden aleatorio, especificando los índices de array o los nombres de campo de estructura a los que se aplican, y GNU C también permite esto como una extensión en el modo C90. Esta extensión no está implementada en GNU C++.
Para especificar un índice de array , escriba ‘[índice] =’ o ‘[índice]’ antes del valor del elemento. Por ejemplo, 
 

     int a[6] = {[4] = 29, [2] = 15 }; or
     int a[6] = {[4]29 , [2]15 };

es equivalente a 
 

     int a[6] = { 0, 0, 15, 0, 29, 0 };
Note:- The index values must be constant expressions.

Para inicializar un rango de elementos con el mismo valor, escriba ‘[first … last] = value’ . Por ejemplo, 
 

int a[] = {[0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

Fuente: gcc.gnu.org
 

C

// C program to demonstrate designated initializers
// with arrays.
#include <stdio.h>
void main(void)
{
    int numbers[100] = {1, 2, 3, [3 ... 9] = 10,
          [10] = 80, 15, [70] = 50, [42] = 400 };
 
    int i;
    for (i = 0; i < 20; i++)   
        printf("%d ", numbers[i]);
     
    printf("\n%d ", numbers[70]);
    printf("%d", numbers[42]);
}

Producción: 
 

1 2 3 10 10 10 10 10 10 10 80 15 0 0 0 0 0 0 0 0 
50 400 

Explicación: 
 

  • En este ejemplo, los tres primeros elementos se inicializan en 1, 2 y 3 respectivamente.
  • Los elementos 4 a 10 tienen un valor de 10.
  • Luego, el elemento 11 se inicializa a 80.
  • El siguiente elemento (12) se inicializa a 15.
  • El elemento número 70 (el 71) se inicializa en 50 y el número 42 (el 43) en 400.
  • Al igual que con la inicialización Normal, todos los valores no inicializados se establecen en cero.

Nota:-

  1. Estos inicializadores no necesitan aparecer en orden.
  2. La longitud de la array es el valor más alto especificado más uno.

C

// C program to demonstrate designated initializers
// to determine size of array.
#include <stdio.h>
 
void main(void)
{
    int numbers[] = {1, 2, 3, [10] = 80, 15,
                    [70] = 50, [42] = 400 };
    int n = sizeof(numbers) / sizeof(numbers[0]);
    printf("%d", n);
}

Producción: 
 

71

Explicación: 
si no se proporciona el tamaño de la array, la posición inicializada más grande determina el tamaño de la array. 
En estructura o unión : 
en un inicializador de estructura, especifique el nombre de un campo para inicializar con ‘.fieldname =’ o ‘fieldname:’ antes del valor del elemento. Por ejemplo, dada la siguiente estructura, 
 

     struct point { int x, y; };

la siguiente inicialización 
 

     struct point p = { .y = 2, .x = 3 }; or
     struct point p = { y: 2, x: 3 };

es equivalente a 
 

     struct point p = { 3, 2 };

C

// C program to demonstrate designated
// initializers with structures
#include <stdio.h>
struct Point
{
    int x, y, z;
};
 
int main()
{
     
    // Examples of initialization using
    // designated initialization
    struct Point p1 = {.y = 0, .z = 1, .x = 2};
    struct Point p2 = {.x = 20};
     
    printf("x = %d, y = %d, z = %d\n",
          p1.x, p1.y, p1.z);
           
    printf("x = %d", p2.x);
     
    return 0;
}

Producción: 

x = 2, y = 0, z = 1
x = 20

También podemos combinar inicializadores designados para arreglos y estructuras.
 

C

// C program to demonstrate designated initializers
// with structures and arrays combined
#include <stdio.h>
void main(void)
{
    struct point { int x, y; };
    struct point pts[5] = { [2].y = 5, [2].x = 6, [0].x = 2 };
    int i;
    for (i = 0; i < 5; i++)   
        printf("%d %d\n", pts[i].x ,pts[i].y);
}

Producción: 
 

2 0
0 0
6 5
0 0
0 0

Referencia:  
https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
 

Publicación traducida automáticamente

Artículo escrito por Avesh_Agrawal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *