Tableau en structure C

Je veux avoir deux tableaux dans une structure, qui sont initialisés au début mais qui ont besoin d’être édités plus tard. J’ai besoin de trois instances de la structure pour pouvoir indexer dans une structure spécifique et la modifier à ma guise. C’est possible?

C’est ce que je pensais pouvoir faire mais je reçois des erreurs:

struct potNumber{ int array[20] = {[0 ... 19] = 10}; char *theName[] = {"Half-and-Half", "Almond", "Rasberry", "Vanilla", …}; } aPot[3]; 

Ensuite, j’accède aux structures comme suit:

  printf("some statement %s", aPot[0].array[0]); aPot[0].theName[3]; … 

Les structures elles-mêmes n’ont pas de données. Vous devez créer des objects du type struct et définir les objects …

 struct potNumber { int array[20]; char *theName[42]; }; /* I like to separate the type definition from the object creation */ struct potNumber aPot[3]; /* with a C99 comstackr you can use 'designated initializers' */ struct potNumber bPot = {{[7] = 7, [3] = -12}, {[4] = "four", [6] = "six"}}; for (i = 0; i < 20; i++) { aPot[0].array[i] = i; } aPot[0].theName[0] = "Half-and-Half"; aPot[0].theName[1] = "Almond"; aPot[0].theName[2] = "Rasberry"; aPot[0].theName[3] = "Vanilla"; /* ... */ for (i = 0; i < 20; i++) { aPot[2].array[i] = 42 + i; } aPot[2].theName[0] = "Half-and-Half"; aPot[2].theName[1] = "Almond"; aPot[2].theName[2] = "Rasberry"; aPot[2].theName[3] = "Vanilla"; /* ... */ 

En C, les éléments de tableau doivent avoir une taille fixe, le caractère char *theNames[] n’est donc pas valide. De plus, vous ne pouvez pas initialiser une structure de cette façon. En C, les tableaux sont statiques, c’est-à-dire qu’on ne peut pas changer leur taille de manière dynamic.

Une déclaration correcte de la structure ressemblerait à ce qui suit

 struct potNumber{ int array[20]; char theName[10][20]; }; 

et vous l’initialisez comme ceci:

 struct potNumber aPot[3]= { /* 0 */ { {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 ssortingngs of max. 20 characters */ } }, /* 1 */ { {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 ssortingngs of max. 20 characters */ } }, /* 2 */ { {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 ssortingngs of max. 20 characters */ } } }; 

Mais je suis sûr que ce n’est pas ce que vous voulez. La bonne façon de faire cela nécessitait un code passe-partout:

 struct IntArray { size_t elements; int *data; }; struct Ssortingng { size_t length; char *data; }; struct SsortingngArray { size_t elements; struct Ssortingng *data; }; /* functions for convenient allocation, element access and copying of Arrays and Ssortingngs */ struct potNumber { struct IntArray array; struct SsortingngArray theNames; }; 

Personnellement, je déconseille fortement l’utilisation de masortingces de C nu. Tout faire à travers les structures et les fonctions d’assistance vous évite les problèmes de dépassement / dépassement de la mémoire tampon et autres problèmes. Chaque codeur C sérieux construit une bibliothèque de codes substantielle avec ce genre de choses au fil du temps.