Ich möchte in einer Struktur einen Pointer auf die Struktur selbst ablegen (um eine Art "this." Operator wie in Java zu erhalten). Ist das möglich?
Ja sicher ist das möglich. Wenn das nicht ginge, wäre es schwierig eine lineare Liste zu programmieren. struct Item { int Daten1; int daten2; struct Item* Next; };
Auch wenn ich die Struktur mit typedef definieren will? typedef struct { int ta[8]; int v[8]; STimer This; }STimer; So jedenfalls nicht :)
Das geht sowieso nicht, weil du innerhalb der struct selbst wieder eine struct vom gleichen Datentyp als Member hast. Ein Objekt von diesem Datentyp hätte unendliche Größe :-) Was spricht dagegen, das so zu machen struct stimer { int ta[8]; int v[8]; struct stimer* this; }; typedef struct stimer STimer; Übrigens: Was du mit diesem this pointer vorhast ist mir noch nicht ganz klar. Ich denke das ist ziemlich sinnlos. Um auf ein Objekt zugreifen zu können, musst du sowieso einen Pointer darauf haben, wozu also diesen Pointer nochmal in der struct speichern. Verbraucht nur Speicher-Platz und bringt dir nichts.
typedef struct STimer_t { int ta[8]; int v[8]; struct STimer_t* This; }STimer; Übrigens halte ich die Idee für relativ sinnlos. Die Adresse der Struktur kannst du jederzeit mit dem Adressoperator bekommen. Der zusätzliche Zeiger benötigt nur unnötig Speicher. In C++ ist der This-Zeiger übrigens auch nicht sowas wie ein Member, sondern eher ein versteckt an die Memberfunktionen übergebener Parameter. Das machst du in C aber normalerweise sowieso schon explizit: void STimer_myfunc(STimer* This) { This->ta[5] = 2; } Also wozu nochmal einen Zeiger auf sich selbst in die Struktur stecken?
"Übrigens: Was du mit diesem this pointer vorhast ist mir noch nicht ganz klar." Jo, mir auch nicht. Wollte nur wissen ob`s geht. Also Dank schon mal dafür.
Bißchen OT, aber die Namensgebung würde ich der Verständlichkeit wegen so wählen:
1 | typedef struct stimer_s { |
2 | int ta[8]; |
3 | int v[8]; |
4 | struct stimer_s *this; |
5 | } stimer_t; |
Ich verstehe die angehängten _s, _t, _u (und da bin ich vermutlich nicht der Einzige) als Indiz für den Typen dahinter: *_s für struct, *_t als Datentyp und *_u als Union...
Man sieht auch manchmal sowas wie
1 | typedef struct stimer_tag |
2 | {
|
3 | } stimer_t; |
Ich weiß aber nicht genau, was das 'tag' bedeuten soll. Übrigens würde ich 'this' nicht als Namen wählen, denn wenn man das mal durch einen C++-Compiler bekommen will, wird's problematisch.
Noch kurz zu dem Thema mit dem "this"-Pointer folgender Thread (hat mir sehr geholfen ;) -> Beitrag "C-Frage"
Es müsste übrigens sogar so gehen:
1 | typedef struct stimer STimer; |
2 | |
3 | struct stimer { |
4 | int ta[8]; |
5 | int v[8]; |
6 | STimer* this; |
7 | };
|
Sieht ein wenig pervers aus (weil man etwas typedef'ed, das zu diesem Zeitpunkt noch gar nicht bekannt ist), und den Namen für die struct selbst braucht man trotzdem noch. Außerdem kann ich mich daran erinnern, dass der AVR-COFF-Konverter über sowas stolpert (nur falls den noch jemand nehmen will).
@oldbug: Danke dir! Genau dahin sind meine Gedanke gegangen. Ich wollte mir eben auch die Referenz auf die Struktur ersparen. Aber dann mach ich es eben weiter wie gehabt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.