Struct l'intérieur de struct
Je dois créer une Personne et chaque Personne doit avoir un Réfrigérateur. Est-ce la meilleure façon de le faire? Si donc ce que je fais mal? Merci à l'avance.
typedef struct {
int age;
struct FRIDGE fridge;
} PERSON;
typedef struct {
int number;
} FRIDGE;
FRIDGE fr;
fr.number=1;
PERSON me;
me.name=1;
me.fridge = fr;
Cela me donne l'erreur suivante:
erreur: le champ ‘réfrigérateur’ a incomplète de type
Vous utilisez anonyme de la structure, de sorte que vous ne devez pas utiliser le
Modifier le code dans la question de la mauvaise façon d'y répondre. Modifier la question de code seulement pour fixer misérable mise en forme, comme une mauvaise indentation.
Point Noté!!!
struct
mot clé, mais l'utilisation de la typedef
'ed nom. Changement struct FRIDGE fridge
à FRIDGE fridge
Modifier le code dans la question de la mauvaise façon d'y répondre. Modifier la question de code seulement pour fixer misérable mise en forme, comme une mauvaise indentation.
Point Noté!!!
OriginalL'auteur sok | 2012-12-26
Vous devez vous connecter pour publier un commentaire.
struct FRIDGE
est quelque chose de différent queFRIDGE
.Vous devez soit utiliser le type de
FRIDGE
dans l'autre structure.ou définir votre réfrigérateur
struct FRIDGE
Aussi, la structure peuvent être définis avant de l'utiliser (par exemple, au-dessus de la personne).
OriginalL'auteur che
Vous devez utiliser les membres de
FRIDGE
, après la suppression de tous les avertissements et les erreurs. DéclarerFRIDGE
avantPERSON
me.fridge.number = 1
ÉDITÉ: j'ai trouvé le bug. Vous utilisez anonyme de la structure, de sorte que vous ne devez pas utiliser le
struct
mot clé, mais l'utilisation de latypedef
ed nom.Changement
struct FRIDGE fridge
pour
FRIDGE fridge
Si vous le faites avant la déclaration de
FRIDGE
, l'erreur a disparu. Il est toujours conseillé pour assigner des valeurs aux membres de structure et non pas à l'ensemble de la structure, à moins de faire quelque chose commememset
. Cela permet d'éviter les erreurs à l'avenir lorsque de plus en plus les membres de la structure sont rajoutés à la déclaration.Eh bien, c'est ce que le code d'origine est en train de faire. Vous avez
fr
initialisée à l'aide du membre, et alors vous êtes juste de mettre la structure à l'autre de la structure. Il n'y aura pas d'erreurs si vous ajoutez plus de membres. (En plus, parfois, je veux que mon code à l'échec lorsque les structures sous-jacentes sont étendues. Il peut être utile de rappel pour ajouter manquant d'initialisation.)...ne pas mentionner que votre deuxième ligne attribue un réfrigérateur structure de
int
.lorsque vous déclarez
struct A { struct B xyz;};
la ligne précédente doit êtrestruct B;
ou une définition complète destruct B
sinon, comment le compilateur de calculer la taille destruct B
et de connaître la quantité de mémoire à allouer pour votre finalestruct A
??OriginalL'auteur manav m-n
Faire la déclaration anticipée de
struct FRIDGE;
Ou,
donner la définition de
FRIDGE
avant de l'utiliser dans structPERSON
OriginalL'auteur Omkant
À l'aide de typedefs avec votre structs vous obtenir dans ce genre de situation inextricable. Le mot-clé struct en face d'un struct identificateur de balise est de savoir comment les structures sont censé être utilisé, c'est aussi plus explicite et plus facile à lire.
Il y a un long et bon blog avec tous les détails ici
https://www.microforum.cc/blogs/entry/21-how-to-struct-lessons-on-structures-in-c/
Mais en bref ce que vous voulez vraiment faire, c'est laisser le typedef est comme ça
Linus Torvalds a également continué à propos de cette fois, très solide raisonnement pourquoi utiliser des typedefs sur l'ensemble de vos structures est source de confusion et de mauvaise.
https://yarchive.net/comp/linux/typedefs.html
OriginalL'auteur Cobusve