2009-08-03 9 views
3

Je peux déclarer une structure:
C - Changer toutes les valeurs d'un tableau de structures en une ligne

typedef struct 
{ 
    int var1; 
    int var2; 
    int var3; 
} test_t; 

Ensuite, créez un tableau de ceux structure struct avec des valeurs par défaut:

test_t theTest[2] = 
{ 
    {1,2,3}, 
    {4,5,6} 
}; 

Mais Après avoir créé le tableau, y a-t-il un moyen de changer les valeurs de la même manière que précédemment, en utilisant une seule ligne, en spécifiant explicitement chaque valeur sans boucle?

Répondre

8

En C99 vous pouvez attribuer à chaque structure dans une seule ligne. Cependant, je ne pense pas que vous puissiez assigner le tableau des structures dans une ligne. C99 introduit des littéraux composés. Voir l'article Dr. Dobbs ici: The New C: Compound Literals

theTest[0] = (test_t){7,8,9}; 
theTest[1] = (test_t){10,11,12}; 

Vous pouvez attribuer à un pointeur comme ceci:

test_t* p; 
p = (test_t [2]){ {7,8,9}, {10,11,12} }; 

Vous pouvez utiliser memcpy ainsi:

memcpy(theTest, (test_t [2]){ {7,8,9}, {10,11,12} }, sizeof(test_t [2]); 

Au-dessus testé avec gcc -std = c99 (version 4.2.4) sur Linux.

Vous devriez lire l'article de Dr. Dobbs pour comprendre comment fonctionnent les littéraux composés.

+0

Je vais essayer une combinaison de ceux-ci pour voir si cela fonctionne. –

+0

Avec cela, vous pouvez créer une macro pour une boucle d'affectation. De cette façon, il est facile à réutiliser et très propre. – Loki

+0

+1 pour savoir que C99 peut le faire, même si C89 ne le peut pas. –

0

Je pense que non, vous pouvez seulement init des tableaux de cette façon. mais vous pouvez modifier les valeurs des structures en utilisant la méthode 'une ligne'

+0

Voulez-vous dire «ne peut pas changer les valeurs»? Voir aussi la réponse mentionnant C99. –

+0

désolé, je n'utilise que -c99 et ne mentionne pas cela. J'utilise souvent cette fonctionnalité: "theTest [0] = (test_t) {7,8,9};" – f0b0s

0

Si les variables sont copiées à partir d'une autre source, vous pouvez utiliser une méthode comme memcpy pour remplacer directement les valeurs de structure. Cependant, le langage ne fournit pas un moyen direct de simplement définir les valeurs, autre que de définir des éléments individuels.

+0

Vous avez oublié C99. –

1

Si vous souhaitez définir les valeurs à zéro (ou -1), vous pouvez utiliser memset:

memset(struct_array, 0, sizeof(struct_array)); 
memset(struct_array, -1, sizeof(struct_array)); 
+0

Vrai, mais pas très complet. Vous avez oublié C99. –

+0

Je viens de mentionner cela comme une méthode alternative pour un cas particulier commun du problème. Je n'ai pas prétendu qu'il résout le problème complet. –