Comment accéder à un nom de variable en fonction d’un index de boucle

J’ai des variables entières, je les ai nommées n0 à n9 . Je veux y accéder en utilisant une boucle. J’ai essayé ce code pour faire ça:

 int n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0; int n5 = 0, n6 = 0, n7 = 0, n8 = 0, n9 = 0; for(i = 0; i < 10; i++){ if(digit == 1){ n[i] = n[i] + 1; } } 

Je sais que ce n’est pas la bonne façon, mais je ne sais pas comment le faire correctement.

Réponse simple: déclarez un tableau à la place, comme int n[10] .


Réponse avancée: cela ne semble pas être le cas ici, mais dans le cas où vous devez utiliser des noms de variable individuels d’éléments de tableau, pour une raison quelconque, vous pouvez utiliser une union:

 typedef union { struct { int n0; int n1; int n2; ... // and so on int n9; }; int array[10]; } my_array_t; 

Si vous avez un ancien compilateur de dinosaures, déclarez la structure avec un nom de variable tel que struct { ... } s;


Comment utiliser le type ci-dessus dans un programme concret et réel:

  my_array_t arr = {0}; for(int i=0; i<10; i++) { arr.array[i] = i + 1; } // access array items by name: printf("n0 %d\n", arr.n0); // prints n0 1 printf("n1 %d\n", arr.n1); // prints n1 2 

Ou vous pouvez initialiser les membres par leur nom:

  my_array_t arr = { .n0 = 1, .n1 = 2, ... }; 

Exemple idiot et artificiel d’utilisation du type ci-dessus pour affecter des valeurs aux variables sans utiliser la notation de tableau:

  my_array_t arr = {0}; // BAD CODE, do not do things like this in the real world: // we can't use int* because that would violate the aliasing rule, therefore: char* dodge_ssortingct_aliasing = (void*)&arr; // ensure no struct padding: static_assert(sizeof(my_array_t) == sizeof(int[10]), "bleh"); for(int i=0; i<10; i++) { *((int*)dodge_strict_aliasing) = i + 1; dodge_strict_aliasing += sizeof(int); } printf("n0 %d\n", arr.n0); // prints n0 1 printf("n1 %d\n", arr.n1); // prints n1 2 for(int i=0; i<10; i++) { printf("%d ",arr.array[i]); // prints 1 2 3 4 5 6 7 8 9 10 } 

La bonne façon de le faire est de déclarer un tableau entier et non 10 variables différentes:

 int n[10]; 

Vous pouvez maintenant accéder à 10 variables int avec n[0] à n[9] .

Il n’est pratiquement pas possible d’accéder à vos variables comme vous le souhaitez, sans tableau.

Tout ce qui me vient à l’esprit, c’est de considérer 10 cas distincts pour chaque variable, donc:

 int i; int n0, n2, n3 ... n9; for(i=0; i<10; i++) { switch(i) { case 0: n0++; break; case 1: ... } } 

Puisque vous ne pouvez pas utiliser de “vrais” tableaux, utilisons plutôt de la mémoire dynamic (vraiment stupide mais …):

 #define NUMVALS 10 int main(int argc, char *argv[]) { int *values, *ptr, i; ptr = values = malloc(sizeof(int) * NUMVALS); for (i = 0; i < NUMVALS; i++) { ptr++ = 0; /* Set the values here or do what you want */ /* Ofc values[i] would work but looks like array access... */ } ... } 

Si vous voulez vraiment accéder à plusieurs variables comme vous le dites, sauvegardez les pointeurs qui les dirigent dans un tableau (ou comme ci-dessus) et accédez-y de cette façon, mais ce n'est toujours pas par nom. Si vous devez y accéder par leur nom, je pense qu’il vous rest le pré-processeur. Je ne connais aucune autre façon appropriée de le faire.

 int n[10] = {0}; /*or you can initilize like this also , this will make all the elements 0 in array*/ for(i = 0; i < 10; i++){ if(digit == 1){ n[i] = n[i] + 1; } } 

Essayez ceci et faites le moi savoir