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
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).
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.
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.
Sie verwenden eine anonyme Struktur, daher sollten Sie die nicht verwenden
struct
Schlüsselwort, aber verwenden Sie dastypedef
ed-Name. Veränderungstruct FRIDGE fridge
zuFRIDGE 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