wake-up-neo.net

Struktur innerhalb Struktur

Ich muss eine Person erstellen und jede Person sollte einen Kühlschrank haben. Ist dies der beste Weg, dies zu tun? Wenn ja, was mache ich falsch? Danke im Voraus.

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;

Das gibt mir den folgenden Fehler:

fehler: Feld "Kühlschrank" hat unvollständigen Typ

10
sok

struct FRIDGE ist etwas anderes als FRIDGE.

Sie müssen entweder den Typ FRIDGE in Ihrer anderen Struktur verwenden.

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

oder definieren Sie Ihren Kühlschrank als struct FRIDGE

struct FRIDGE {
 int number;
};

Möglicherweise muss die Struktur vor der Verwendung definiert werden (z. B. über der Person).

19
che

Sie müssen Mitglieder von FRIDGE verwenden, nachdem Sie alle Warnungen und Fehler entfernt haben. Deklarieren Sie FRIDGE vor PERSON

me.fridge.number = 1

BEARBEITET: Ich habe den Fehler gefunden. Sie verwenden eine anonyme Struktur. Verwenden Sie daher nicht das Schlüsselwort struct, sondern den Namen typedefed.

struct FRIDGE fridge in FRIDGE fridge ändern

3
manav m-n

Entweder die Vorwärtsdeklaration von struct FRIDGE; 

Oder, 

geben Sie die Definition von FRIDGE an, bevor Sie sie in struct PERSON verwenden.

1
Omkant

Durch die Verwendung von Typedefs mit Ihren Strukturen werden Sie in diese Art von Verwirrung geraten. Das Schlüsselwort struct vor einem struct-Tag-Bezeichner gibt an, wie Struktu- ren verwendet werden sollen. Dies ist auch expliziter und leichter lesbar.

Es gibt einen langen und guten Blog-Post mit allen Details hier https://www.microforum.cc/blogs/entry/21-wie-nach-struktur-lose-ononstruktur-in-c/

Kurz gesagt, was Sie wirklich tun wollen, ist, die Typedefs so wegzulassen

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 hat dies auch schon einmal gesagt, eine sehr solide Begründung, warum die Verwendung von Typedefs für alle Ihre Strukturen verwirrend und schlecht ist.

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

0
Cobusve