[Gelöst] verschachtelte Struktur initialisieren
-
Hallo,
ich habe eine globale Struktur die im Header wie folgt definiert ist.struct struktur{ char a; char b; char c; struct b *; struct c; struct d; struct struktur *; } name;
In der Quelldatei reserviere ich für die Struktur ein Platz im Heap mit der malloc Funktion und lasse ein Zeiger darauf zeigen. Wenn ich jetzt versuche die inneren Strukturen c und d zu initialisieren, bekomme ich immer die Fehlermeldung "error: expected expression before '{' token". Die Initialisierung sieht wie folgt aus.
zeiger->c = {1, 2, 3, 4}; zeiger->d = {1, 2, 3, 4};
Wenn ich die Elemente von den inneren Strukturen einzeln anspreche und initialisiere scheint alles zu funktionieren. Ich habe es auch schon mit doppelten geschfeiten Klammern probiert, aber leider ohne Erfolg. Meine Frage ist nun muss ich die Elemente der inneren Strukturen einzeln initialisieren oder gibt es eine Möglichkeit alle Elemente in einem Rutsch zu initialisieren?
-
Das geht nie, egal ob verschachtelt oder nicht. Die Zuweisung mit den geschweiften Klammern geht nur bei der allerersten Initialisierung. Das ist dann auch keine richtige Zuweisung in dem Sinne, dass da irgendein Objekt erstellt und kopiert würde, sondern setzt eben einfach der Anfangswert der Elemente.
Möglichkeiten:
1. Elementweise Zuweisungen
2. Ein passendes Objekt erstellen und dieses kopieren (unnötige Zwischenschritte)
-
Doch das geht, warum sollte das nicht gehen?
struct b {char c;} bstruct; struct struktur{ char a; char b; char c; struct b *; struct c; struct d; struct struktur *; } name={'a','b','c',&bstruct,{struct c elemente...},{struct d elemente},NULL};
-
Wutz schrieb:
Doch das geht, warum sollte das nicht gehen?
struct b {char c;} bstruct; struct struktur{ char a; char b; char c; struct b *; struct c; struct d; struct struktur *; } name={'a','b','c',&bstruct,{struct c elemente...},{struct d elemente},NULL};
Siehe:
SeppJ schrieb:
2. Ein passendes Objekt erstellen und dieses kopieren (
unnötige Zwischenschritte)
-
Siehe compound literals:
struct b {char c;} bstruct; struct struktur{ char a; char b; char c; struct b *; struct c; struct d; struct struktur *; } name={'a','b','c',&(struct b){'b'},{struct c elemente...},{struct d elemente},NULL};
-
Ich verstehe nicht, was Deinen Code von SeppJs Vorschlag abhebt.
Zur Erinnerung:
7by schrieb:
In der Quelldatei reserviere ich für die Struktur ein Platz im Heap mit der malloc Funktion und lasse ein Zeiger darauf zeigen. Wenn ich jetzt versuche die inneren Strukturen c und d zu initialisieren[...]
Da ist nix mit initialisieren.
Was man machen kann ist ein Objekt initialisieren und danach kopieren - wie SeppJ beschrieben hat und wofür Du Code gezeigt hast (jedenfalls für die Initialisierung).
-
Das compound literal übernimmt die Aufgabe eine 'temporären Objekts', in diesem Fall bei einer Initialisierung.
Daran ist nichts schwer zu verstehen.
Und der Code ist kurz und übersichtlich und läuft ab C99 sogar standardkonform.
-
Wutz schrieb:
Das compound literal übernimmt die Aufgabe eine 'temporären Objekts', in diesem Fall bei einer Initialisierung.
Die Initialisierung von
name
ist ja über alle Zweifel erhaben.
Das ist der "Ein passendes Objekt erstellen" Teil aus SeppJs Antwort.Jetzt braucht der TE noch eine Kopie von
name
an*zeiger
- das wäre dann der zweite Teil ("und dieses kopieren").Ich sehe kein Mehr an Information in Deinen Postings, das über die erste(!) Antwort hinausgeht.
-
Du hast keine Ahnung, wovon du redest.
Du hast compound literale nicht verstanden und/oder willst sie nicht verstehen.
Und wenn du lesen könntest wäre dir aufgefallen, dass der Unterschied zw. meinem ersten Beitrag und den folgenden genau compound literal ist, was das Problem der Initialisierung ohne Extra-Element-Kopie löst.
-
Wutz schrieb:
Du hast keine Ahnung, wovon du redest.
Du hast compound literale nicht verstanden und/oder willst sie nicht verstehen.
Und wenn du lesen könntest wäre dir aufgefallen, dass der Unterschied zw. meinem ersten Beitrag und den folgenden genau compound literal ist, was das Problem der Initialisierung ohne Extra-Element-Kopie löst.Ich nehme an, Du wirst pampig, weil Du keine Ahnung hast wovon ich rede.
Aber das ist nicht schlimm.Vielleicht hast Du dem TE ja auch geholfen mit der Initializer List, wenn's nur um die Initialisierung der globalen Variable
name
ging.
Schließlich scheint er/sie ja nicht so sicher mit C-Sprech.So wie ich es verstanden habe, will er/sie ein Objekt allozieren und initialisieren:
#include <stdlib.h> struct gadget { int i; }; struct widget{ struct gadget* g; } the_widget = { &(struct gadget){42} }; int main(void){ /* wie *p initialisieren? */ struct widget *p = malloc(sizeof(*p)); /* ... */ free(p); return 0; }
Das dürfte schwerlich möglich sein, kopieren und elementweise Zuweisung ausgenommen. Aber ich bin immer offen, Neues zu lernen.
Übrigens: wie Du siehst habe ich noch ein compound literal eingebaut.
Das tut zwar nix zur Sache - ist aber das Beste seit geschnitten Brot...Schönen Tag noch!
-
Hallo,
vielen Dank für eure Mühe. Ich weiß jetzt wie ich das Problem lösen kann und habe sogar noch einiges gelernt (
->
).