Struktur innerhalb von Struktur

Lesezeit: 3 Minuten

Benutzeravatar von sok
sok

Ich muss eine Person erstellen und jede Person sollte einen Kühlschrank haben. Ist dies der beste Weg? 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;

Dies gibt mir den folgenden Fehler:

Fehler: Das Feld „Kühlschrank“ hat einen unvollständigen Typ

  • Sie verwenden eine anonyme Struktur, daher sollten Sie die nicht verwenden struct Schlüsselwort, aber verwenden Sie das typedefed-Name. Veränderung struct FRIDGE fridge zu FRIDGE fridge

    – manav mn

    26. Dezember 2012 um 13:26 Uhr


  • @Manav: Das Bearbeiten des Codes in der Frage ist der falsche Weg, um darauf zu antworten. Bearbeiten Sie den Fragecode nur, um miserable Formatierungen wie falsche Einzüge zu korrigieren.

    – Ben Voigt

    26. Dezember 2012 um 13:32 Uhr

  • @BenVoigt: +1 Punkt notiert!!!

    – manav mn

    26. Dezember 2012 um 13:34 Uhr

Benutzeravatar von che
che

struct FRIDGE ist etwas anderes als FRIDGE.

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

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

oder definieren Sie Ihren Kühlschrank als struct FRIDGE

struct FRIDGE {
 int number;
};

Außerdem muss die Struktur eventuell vor der Verwendung definiert werden (z. B. über der Person).

Benutzeravatar von manav mn
manav mn

Sie müssen Mitglieder von verwenden FRIDGE, nachdem alle Warnungen und Fehler entfernt wurden. Erklären FRIDGE Vor PERSON

me.fridge.number = 1

BEARBEITET: Ich habe den Fehler gefunden. Sie verwenden eine anonyme Struktur, daher sollten Sie die nicht verwenden struct Schlüsselwort, aber verwenden Sie das typedefEd-Name.

Veränderung struct FRIDGE fridge
zu FRIDGE fridge

  • Das ist nicht das Problem, der moderne Dialekt von C unterstützt die direkte Zuweisung von Strukturen. Siehe Fehlermeldung.

    – che

    26. Dezember 2012 um 12:36 Uhr

  • Wenn Sie die Erklärung von weiterleiten FRIDGE, der Fehler ist weg. Es ist immer ratsam Strukturmitgliedern Werte zuzuweisen und nicht der gesamten Struktur, es sei denn, Sie tun so etwas wie memset. Dies vermeidet Fehler in der Zukunft, wenn weitere Strukturmitglieder zu ihrer Deklaration hinzugefügt werden.

    – manav mn

    26. Dezember 2012 um 12:39 Uhr

  • Nun, das ist es, was der ursprüngliche Code tut. Du hast fr mit dem Member initialisiert, und dann fügen Sie die Struktur einfach in die andere Struktur ein. Es treten keine Fehler auf, wenn Sie weitere Mitglieder hinzufügen. (Außerdem möchte ich manchmal, dass mein Code fehlschlägt, wenn zugrunde liegende Strukturen erweitert werden. Es kann eine nützliche Erinnerung sein, fehlende Initialisierungen hinzuzufügen.)

    – che

    26. Dezember 2012 um 12:47 Uhr

  • …ganz zu schweigen davon, dass Ihre zweite Zeile eine Kühlschrankstruktur zuweist int.

    – che

    26. Dezember 2012 um 12:49 Uhr

  • @che: wenn du erklärst struct A { struct B xyz;}; die vorangehende Zeile sollte sein struct B; oder eine vollständige Definition von struct B Wie würde der Compiler sonst die Größe von berechnen struct B und wissen, wie viel Speicher Sie für Ihr Finale zuweisen müssen struct A??

    – manav mn

    26. Dezember 2012 um 12:53 Uhr

Wenn Sie typedefs mit Ihren Strukturen verwenden, geraten Sie in diese Art von Verwirrung. Das Schlüsselwort struct vor einem struct-Tag-Bezeichner gibt an, wie Strukturen verwendet werden sollen, dies ist auch expliziter und einfacher zu lesen.

Hier gibt es einen langen und guten Blogbeitrag mit allen Details
https://www.microforum.cc/blogs/entry/21-how-to-struct-lessons-on-structures-in-c/

Aber kurz gesagt, was Sie wirklich tun möchten, 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 ging auch einmal darauf ein, 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

Führen Sie entweder die Vorwärtsdeklaration von aus struct FRIDGE;

Oder,

geben Sie die Definition von FRIDGE bevor Sie es in struct verwenden PERSON

1432670cookie-checkStruktur innerhalb von Struktur

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy