Hallo, in C kann man doch den Compiler die Anzahl der Indexe selbst festlegen lassen, wenn man [] schreibt. Ich möchte ein Array von Strings definieren, bei dem die Anzahl der Strings vom Compiler angepasst wird. Der Compiler meckert aber das [] an: const char status_module_txtarr[][STATUS_MODULE_TXT_MAXLEN]= { "String 1", "String 2", "String 3", "String 4" }; Ich habe schon nach Beispielen gesucht, aber nur sowas wie Array[3][4] gefunden. Wie definiert man das richtig?
1 | const char * const status_module_txtarr[] = |
2 | {
|
3 | "String 1", |
4 | "String 2", |
5 | "String 3", |
6 | "String 4"
|
7 | };
|
Edit: Oder möchtest du dein "STATUS_MODULE_TXT_MAXLEN" explizit verwenden?
:
Bearbeitet durch User
Elektrolurch schrieb: > Wie definiert man das richtig? Genau so, wie du es da stehen hast. Man kann in C den ersten Index weglassen, wenn man ein Feld initalisiert; dann nimmt der Compiler die Anzahl der Initialisierungen als Länge. Das Problem wird woanders liegen.
Elektrolurch schrieb: > Ich möchte ein Array von Strings definieren, bei dem die Anzahl der > Strings... Ist dir klar, daß ein Array aus Elementen gleicher Größe zusammengesetzt ist? Wenn du ein Array aus Zeigern machst, dann ist das der Fall. Aber wenn du einfach mehrere Zeichenketten unterschiedlicher Länge hintereinander setzen willst, dann klappt das mit einem Array eben nicht. Jedenfalls in C. Bei Pascal könnte man zuvor einen Stringtyp passender Länge definieren, womit man wieder ein Array damit machen könnte - allerdings ein bissel verschwenderisch, denn die Länge des Typs muß sich am längsten String orientieren und alle kürzeren würden dann Platz verplempern. Aber das soll hier nur als Beispiel dienen, daß es in anderen Programiersprachen ggf. auch anders geht. In C kannst du nur Zeiger auf Textketten in ein Array fassen, eben so, wie Adam es dir gezeigt hat. W.S.
W.S. schrieb: > Aber wenn du einfach mehrere Zeichenketten unterschiedlicher Länge > hintereinander setzen willst, dann klappt das mit einem Array eben > nicht. Deswegen wurde die Größe ja per: Elektrolurch schrieb: > STATUS_MODULE_TXT_MAXLEN festgelegt. W.S. schrieb: > Bei Pascal könnte man zuvor einen Stringtyp passender Länge definieren, > womit man wieder ein Array damit machen könnte - allerdings ein bissel > verschwenderisch, denn die Länge des Typs muß sich am längsten String > orientieren und alle kürzeren würden dann Platz verplempern. Das geht genau so wie gezeigt auch in C. Und wenn man z.B.
1 | #define STATUS_MODULE_TXT_MAXLEN 100
|
macht, dann hat man für jeden der Strings Platz für 99 Zeichen plus Stringterminierung. > Aber das soll hier nur als Beispiel dienen, daß es in anderen > Programiersprachen ggf. auch anders geht. In C kannst du nur Zeiger auf > Textketten in ein Array fassen, eben so, wie Adam es dir gezeigt hat. Unsinn.
Rolf M. schrieb: > Deswegen wurde die Größe ja per: > > Elektrolurch schrieb: >> STATUS_MODULE_TXT_MAXLEN > > festgelegt. Und? Ist dir eigentlich klar, was sowas wie meintyp A[B][C]; bedeutet? Offenbar nicht. W.S.
Ein c-string ist eine Abfolge von Zeichen gefolgt von einem 0 byte. Dieses legt das Ende, und damit die länge des c-strings fest. Bei char A[B]="123" muss man natürlich aufpassen, dass B gross genug ist, sonst wird es abgeschnitten. Aber es ist OK, wenn es zu gross ist, der c-string endet weiterhin beim 0 byte, und es ist weiterhin ein c-string. char A[B][C] ist ein mehrdimensionales Array, eine Matrix. Jedes Element von A ist char[C] gross. Ändert aber nichts daran, dass man da c-strings drinn speichern kann. Und die länge des c-strings ist halt nicht definiert durch dessen Anzahl Elemente, sondern durch das 0 byte. Und damit hat man effektiv und wahrlich ein Array aus c-strings unterschiedlicher Länge. Es gibt sprachen, bei denen man Strings beliebiger länge in ein Array packen kann. Aber diese verstecken den Pointer auf den Text lediglich vor dem Nutzer. Es kann in dem fall technisch gesehen trotzdem war sein, dass es ein arrays von strings ist, da der pointer in dem fall meist implizit teil der Datenstruktur ist, die sie dort string nennen, und man damit nicht die Textdaten + 0 byte meint, wie bei einem c-string. In c kann man natürlich auch eine Datenstruktur definieren, und diese string nennen. Das andere Sprachen das "können" und c nicht, ist also höchstens reine Terminologie, und nicht tatsächlich der fall. Manche Sprachen können eventuell auch Listen alla "test\0abc\0def\0" als Liste definieren. Aber das ist dann kein Array mehr, sondern eine Liste.
Danke schon mal. Aber meine Definition müsste also korrekt sein? Der Compiler bringt aber folgende Fehlermeldung: Array type has incomplete element type char[]".
Dann zeig doch mal den Quelltext (am besten als Anhang). Die paar gezeigten Zeilen sind in Ordnung, über den Rest kann man doch nur spekulieren... Und dann langweilen sich irgendwelche Leute, und werfen Rolf M. vor er wüsste nicht was ein Array ist.
:
Bearbeitet durch User
Vermutung: du hast STATUS_MODULE_TXT_MAXLEN leer definiert, also etwa so: #define STATUS_MODULE_TXT_MAXLEN anstatt #define STATUS_MODULE_TXT_MAXLEN 123 // oder was anderes (Aber natürlich Spekulation mangels Quelltext)
:
Bearbeitet durch User
@ Klaus W. Du hattest recht! Peinlich, Asche auf mein Haupt. Ich habe aus Versehen einen ähnlichen Define benutzt, der tatsächlich leer war (Editier- / Kopierfehler). Wenn man den Fehler weis, ist die Fehlermeldung logisch ;-) Danke euch.
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.