2016-12-09 1 views
4

Si j'avais un tableau tel que les nombres int [5] je pourrais lui assigner des valeurs avec des nombres [0] = 1 ou des nombres [3] = 4. Puis si j'avais une structure telle queStructures et leur transmettre des valeurs

struct structName 
{ 
    int number0; 
    int number1; 
    int number2; 
}; 

est-il un moyen de faire quelque chose comme ce qui suit (notez ce n'est pas le code de travail)

int main(void) 
{ 
    struct structName name; //how could i declare this to do the following 
    for(int i = 0; i < 2; i++) 
    { 
     name[i] = i; //maybe name.[i] 
    } 
} 

donc est-il possible d'écrire le nom [variable] = someNumber pour attribuer someNumber dire number0 (si la variable était 0) ou number2 (si la variable était 2). Je cherche depuis des jours et ne peux pas trouver quelque chose qui fait cela. (Peut-être je ne sais pas ce qu'il faut chercher)

+1

si 'struct structName {int num [3]; }; 'then' nom.num [i] = i; ' – BLUEPIXY

+2

http://ideone.com/x1pz4Z – BLUEPIXY

Répondre

5

est-il un moyen de faire quelque chose comme ce qui suit

Non, il n'y a aucun moyen d'accéder aux champs de la structure par index. Vous utilisez les noms des champs à la place:

struct structName name; 
name.number0 = someNumber; 
name.number1 = someOtherNumber; 

Si vous souhaitez accéder aux valeurs par index, utilisez un tableau à la place, même si elle est intégrée dans la structure:

struct structName 
{ 
    int numbers[3]; 
    // other fields here 
}; 

Ensuite, vous pouvez dire :

struct structName name; 
for (int i = 0; i <= 2, i++) { 
    name.numbers[i] = i; 
} 
1

Oui, avec une manipulation de mémoire étrange et déconseillée. Vous êtes beaucoup mieux d'utiliser un tableau.

struct structName 
{ 
    int numbers[3]; 
}; 

int main(void) 
{ 
    struct structName name; 
    for(int i = 0; i <= 2; i++) 
    { 
     name.numbers[i] = i; 
    } 
} 

Notez également que vous avez eu des erreurs de syntaxe dans votre boucle for et une erreur hors par un.

4

Vous pouvez écrire une fonction qui utilise une instruction switch qui vous permet d'accéder aux champs par index. Quelque chose comme:

#include<stdio.h> 

struct structName{ 
    int number0; 
    int number1; 
    int number2; 
}; 

void assign(struct structName * name, int i, int j){ 
    switch(i){ 
     case 0: 
      name->number0 = j; 
      break; 
     case 1: 
      name->number1 = j; 
      break; 
     case 2: 
      name->number2 = j; 
      break; 
    } 
} 

int main(void){ 
    int i; 
    struct structName name; 
    for(i = 0; i <= 2; i++){ 
     assign(&name,i,i); 
    } 
    //test: 
    printf("%d\n",name.number0); 
    printf("%d\n",name.number1); 
    printf("%d\n",name.number2); 
    return 0; 
} 

(qui imprime 0,1,2 comme prévu). Inutile de dire qu'il n'y a pas grand intérêt à le faire (par opposition à avoir simplement un champ qui est un tableau) sauf si la structure en question est déjà définie comme faisant partie d'une API ou faisant déjà partie d'un base de code qui n'est pas facilement refactorisé.

+0

Il est à noter que @BLUEPIXY a caché une solution de macro au problème d'OP derrière un lien dans un commentaire à la question originale. –

-1

macros avec des arguments doivent travailler

#define name(x) x 

nom So (1) deviendrait 1. nom (2) deviendrait 2 et ainsi de suite.

+1

Comment proposez-vous exactement d'utiliser cette macro pour affecter une valeur à, par exemple, le champ 'number2' de' struct' de l'OP? –

-1

En C, il n'y a pas de cuillère.

struct structName name; 
int *idx = &name; // First we need a memory address to the struct 
for (int i = 0; i < sizeof(name)/sizeof(*idx); ++i) { 
    // idx[i] == name.numberX 
    idx[i] = i; 
} 

Maintenant, si vous vérifiez les valeurs de name.number0, name.number1, name.number2 vous verrez qu'ils contiennent les valeurs correctes.

Ce n'est pas une très bonne façon de faire les choses avec des structures, mais je me suis senti obligé de répondre après que la réponse supérieure prétend que c'est impossible.

+1

Cette solution peut fonctionner ou non: 'struct's peut contenir un remplissage, dont vous ne tenez pas compte. Ceci est un détail dépendant de l'implémentation. –

+0

La structure est composée uniquement de 3 entiers ne contenant aucun remplissage. Tant que l'index est géré avec soin, vous pouvez toujours accéder aux données struct par index. Juste, dans ce cas, il était préférable d'itérer par la taille d'un entier. – interputed