Hallo Leute ! Ich möchte eine Stringlist deklarieren, etwa so: typedef struct { uint8_t anzahl; char *s[]; } tl; const tl = {3,"murks","mehrmurks","nochmehrmurks"}; Die Anzahl der Strings soll variabel sein. Im Printzip geht das auch so, man bekommt nur einen Sack voll Warnungen, weil zuviel Initializer Elemente vorhanden sind. Was ja auch stimmt. Nur wie deklariert man so etwas? MfG Edgar
Warum benötigst du dazu einen eigenen Typ? Nimm ein Array aus Zeigern und setze den letzten Zeiger auf NULL. So kann man den letzten Eintrag sehr einfach erkennen und es ist keine zusätzliche Anzahl-Variable vorhanden, die einen falschen Wert haben kann.
1 | const char * const List[] = { |
2 | "Hello world!", |
3 | "Text", |
4 | NULL
|
5 | };
|
Nachtrag: Mit einem struct würde die Sache so aussehen:
1 | typedef struct{ |
2 | const char * const * s; |
3 | }t1; |
4 | |
5 | const t1 Test = {(const char * const[]){"Hello world!", "Text", NULL}}; |
iwoasesned schrieb: > Nur wie deklariert man so etwas? Du meinst: wie intialisiert man so etwas. So wie immer, wenn in einer struct eine darunterliegende Datenstruktur enthaletn ist. Mit zusätzlichen { } Klammern, die die eingebettete Datenstruktur kenntlich machen
1 | const tl = {3, { "murks","mehrmurks","nochmehrmurks" } }; |
iwoasesned schrieb: > typedef struct > { > uint8_t anzahl; > char *s[]; > } tl; > > const tl = {3,"murks","mehrmurks","nochmehrmurks"}; tl ist ein Type(def); den kann man nicht so initialisieren. > Nur wie deklariert man so etwas?
1 | tl const tl_const = { 3, {"murks", "murkser", "am murksten" }}; |
Man sollte aber beachten, dass die Initialisierung von Flexible Array Members eine Erweiterung des GCC gegenüber dem C-Standard ist. Bei anderen Compilern ist das evtl. ein Fehler.
Yalu X. schrieb: > Man sollte aber beachten, dass die Initialisierung von Flexible Array > Members eine Erweiterung des GCC gegenüber dem C-Standard ist. Bei > anderen Compilern ist das evtl. ein Fehler. Korrekt, hab das nochmals nachgelesen. In meiner Variante habe ich einen Zeiger auf einen Zeiger verwendet, weil ich die flexiblen Arrays so oder so nicht mag. Ein Konstrukt, das nur ein flexibles Array zulässt, ist für mich unbrauchbar. Was wenn ich mehrere benötigte? Dann lieber einen Zeiger, auch wenn es nur ein Array ist. So ist es wenigstens immer gleich. PS: Mit dem entsprechenden Compilerflag wird man vom GCC auch gewarnt:
1 | warning: initialization of a flexible array member [-Wpedantic] |
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.