Forum: Mikrocontroller und Digitale Elektronik Strukturen die sich gegenseitig einbinden/referenzieren


von Thomas Frosch (Gast)


Lesenswert?

Hi Leute,

ich habe folgendes Problem beim kompilieren in CodeWarrior.
1
typedef struct
2
{
3
   STRUKTUR1 *refAufTypStruktur1;
4
5
} Sub_Struct ;
6
7
8
typedef struct
9
{
10
   Sub_Struct subStruct;
11
12
} STRUKTUR1;

Problem ist, dass das typedef von STRUKTUR1 zwar funktioniert da 
Sub_Struct bereits bekannt ist, jedoch das typedef von Sub_Struct nicht, 
da hier STRUKTUR1 noch nicht bekannt ist.

Gibt es sowas wie ein typedef struct Prototyp oder so?
von Daniel V. (danvet)


Lesenswert?

Was soll das denn werden? Du willst innerhalb der Struktur auf die 
Struktur zeigen? Wozu soll das gut sein?
von (prx) A. K. (prx)


Lesenswert?

Thomas Frosch schrieb:

> Gibt es sowas wie ein typedef struct Prototyp oder so?

Sowas Ähnliches:
1
struct STRUKTUR1;
2
3
typedef struct
4
{
5
   struct STRUKTUR1 *refAufTypStruktur1;
6
} Sub_Struct ;
7
8
typedef struct STRUKTUR1
9
{
10
   Sub_Struct subStruct;
11
} STRUKTUR1;
von Thomas Frosch (Gast)


Lesenswert?

gut Danke!!! Ist auch wirklich sichergestellt, dass das so funktioniert? 
Muss er nicht irgendwie wissen wie groß die struct ist auf die gezeigt 
wird?
von (prx) A. K. (prx)


Lesenswert?

Thomas Frosch schrieb:

> Muss er nicht irgendwie wissen wie groß die struct ist auf die gezeigt
> wird?

Erst dort wo der Zeiger konkret im Code verwendet wird. Der Zeiger 
selbst ist von der Grösse der Struct nicht betroffen.
von Thomas Frosch (Gast)


Lesenswert?

Wozu das gut sein soll?!

Hab ich mir nicht ausgedacht! Programmiere nach einer 
Autosar-Spezifikation. Dabei geht es um ein Konfigurationsstruktur, die 
jedoch weitaus größer aufgezogen ist. Da referenziert auch nicht eine 
Struktur auf eine andere sondern es schließen ca. 5 oder mehr Strukturen 
den Kreis.

An unterschiedlichen Stellen sind unterschiedliche Informationen 
bekannt. Aus diesen muss dann schlussendlich wieder auf andere 
Informationen geschlossen werden. Dabei können die Strukturen sowie 
Treiber ausgetauscht werden... So wird viel mit referenzen etc. 
gearbeitet.

Man könnte das sicherlich auch anders lösen, jedoch sind die Referenzen 
bei der gewählten Architektur Sinnvoll, da ich anders nicht an die 
Informationen rankomme. Wieso die Architektur gerade so gewählt wurde 
versteh ich auch noch nicht so 100%ig macht jedoch immer mehr Sinn.
von Matthias (Gast)


Lesenswert?

Nö. Muss er nicht, da ein "pointer" innerhalb eines Systems immer eine 
bekannte Größe hat (bei 32-Bit Architekturen sollten das 4 Byte sein).

Er will nur eine Deklaration der Struktur haben, auf die er zeigen soll.
Theoretisch könntest Du auch "void * struktur" schreiben. Allerdings 
darfste dann bei jedem Zugriff auf das Teil einen expliziten typecast 
durchführen
(sowas kann VIEL Schreibaufwand werden).
von Thomas Frosch (Gast)


Lesenswert?

Danke für die schnelle Hilfe!!
von (prx) A. K. (prx)


Lesenswert?

Thomas Frosch schrieb:

> Da referenziert auch nicht eine
> Struktur auf eine andere sondern es schließen ca. 5 oder mehr Strukturen
> den Kreis.

Ist so ungewöhnlich nicht. Darüber stolpert man ansatzweise bereits, 
wenn eine Struct einen Pointer auf den eigenen Typ enthält, also 
beispielsweise eine verkettete Liste implementiert wird. Denn schon dort 
steht der Name eines Typedefs lexikalisch hinter der Verwendung.

Historischer Hintergrund hiervon ist, dass es anfangs keine Typedefs 
gab, man stets mit "struct X" arbeitete, und dann hat man zumindest bei 
der selbstreferenziellen Methode kein Problem. Für den Rest bestand 
damals bereits die Möglichkeit, mit "struct X" Strukturen zu benennen, 
deren Inhalt nicht bekannt ist, was mangels bekannter Grösse natürlich 
nur im Zusammenhang mit Pointern sinnvoll ist.

Die erste Zeile in meinem Beispiel hat übrigens nur dokumentarischen 
Charakter. Es geht auch ohne. Aber sie offenbart dem Leser, dass diese 
Struct noch kommen wird, vergleichbar dem Prototype einer Funktion.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.