web-dev-qa-db-fra.com

Struct à l'intérieur de la structure

Je dois créer une personne et chaque personne devrait avoir un réfrigérateur. Est-ce la meilleure façon de le faire? Si c'est le cas, que fais-je de travers? Merci d'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’ est de type incomplet

10
sok

struct FRIDGE est quelque chose de différent de FRIDGE.

Vous devez soit utiliser le type FRIDGE dans votre autre structure.

typedef struct {
 int age;
 FRIDGE fridge;
} PERSON;

ou définissez votre réfrigérateur comme struct FRIDGE

struct FRIDGE {
 int number;
};

En outre, il peut être nécessaire de définir la structure avant de l’utiliser (par exemple, au-dessus de la personne).

19
che

Vous devez utiliser les membres de FRIDGE après avoir supprimé tous les avertissements et les erreurs. Déclarez FRIDGE avant PERSON

me.fridge.number = 1

ÉDITÉ: J'ai trouvé le bogue. Vous utilisez une structure anonyme, vous ne devez donc pas utiliser le mot clé struct mais utiliser le nom typedefed.

Remplacez struct FRIDGE fridge par FRIDGE fridge

3
manav m-n

Soit la déclaration en aval de struct FRIDGE; 

Ou, 

donnez la définition de FRIDGE avant de l'utiliser dans struct PERSON

1
Omkant

L'utilisation de typedefs avec vos structures vous mènera à ce type d'enchevêtrement. Le mot-clé struct situé devant un identificateur de balise struct est la façon dont les structures sont censées être utilisées. Ceci est également plus explicite et plus facile à lire.

Il y a un long et bon article sur le 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 de côté le typedef

struct FRIDGE;  // This is a forward declaration, now an incomplete type

struct PERSON{
 int age;
 struct FRIDGE fridge;
};

struct FRIDGE{
 int number;
};

struct FRIDGE fr;
fr.number=1;

struct PERSON me;
me.name=1;
me.fridge = fr;

Linus Torvalds a également parlé de cela une fois, raison très solide pour laquelle l’utilisation de typedefs sur toutes vos structures est déroutante et mauvaise.

https://yarchive.net/comp/linux/typedefs.html

0
Cobusve