2016-09-10 3 views
3

Ein Ausschnitt meiner Strukturdeklaration:C-Struktur, unvollständige Feldtyp

struct record{ 
    char type[4]; 
    uint32_t data_size; 
    uint32_t flags; 
    uint32_t id; 
    uint32_t revision; 
    uint16_t version; 
    uint16_t unknown; 
    uint8_t *data; 
}; 

struct group; 

union subgroup_record{ 
    int type; 
    struct group subgroup; 
    struct record record; 
}; 

struct record_list{ 
    union subgroup_record subgroup_record; 
    struct record_list *next; 
}; 

struct group{ 
    char type[4]; 
    uint32_t group_size; 
    uint8_t label[4]; // depends on group_type 
    int32_t group_type; 
    uint16_t stamp; 
    uint16_t unknown1; 
    uint16_t version; 
    uint16_t unknown2; 
    struct record_list record_list; 
}; 

struct group_list{ 
    struct group group; 
    struct group_list *next; 
}; 

struct plugin{ 
    struct record header; 
    struct group_list top_groups; 
}; 

Der Compiler gibt mir diese Fehlermeldung:

error: field ‘subgroup’ has incomplete type 

Vorwärts erklärt die Struktur nicht helfen, die typedef'ing struct und das Ändern der Deklarationen hat auch nicht geholfen und ich hätte lieber keine Zeiger überall (für einen Anfänger ist das Zuweisen und Freigeben von Speicher ein wenig beängstigend)

Irgendeine Lösung dafür?

Danke!

+1

_Hinweis: _ In 'subgroup_record' gibt es' int type', aber dies sollte wahrscheinlich 'char type [4]' sein, um mit den 'type' Definitionen in den anderen' union' Elementen [oder umgekehrt zu kompatibel zu sein ]. Nicht kritisch [oder falsch], nur ein FYI/IMO ... –

+0

'struct Datensatzliste Datensatzliste;' -> 'struct Datensatzliste * Datensatzliste;' Hinzufügen '*'. – chux

Antwort

2

Sie haben eine zirkuläre rekursive Definition.

Der Typ struct group enthält den Typ struct record_list, die den Typ enthält union subgroup_record, die den Typ struct group

A-Typ enthalten, können nicht selbst enthält.

+0

Schöne Antwort, aber ich würde darüber nachdenken, vielleicht ein Beispiel hinzufügen, das das Problem löst, indem Sie Zeiger anstelle der tatsächlichen Typen verwenden ...? – Myst

+0

@Myst Sie können eine eigene Antwort hinzufügen, wenn Sie das für wichtig halten. – 2501

+0

Ich denke, dass eine gute Antwort für zukünftige Leser besser ist. Deines ist bereits gut genug für jeden, der auf das Problem trifft (daher habe ich es aufgestockt). Der Kommentar war sowohl ein Vorschlag als auch für zukünftige Leser in ihrem Code zu implementieren. – Myst