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?
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.
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)
@ 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.