Forum: Mikrocontroller und Digitale Elektronik Hilfe bei String-Array benötigt


von Elektrolurch (Gast)


Lesenswert?

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?

von Adam P. (adamap)


Lesenswert?

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
von 🐧 DPA 🐧 (Gast)


Lesenswert?

Funktioniert hier einwandfrei: https://godbolt.org/z/K9EcTh9GM

von Klaus W. (mfgkw)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

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.

von Elektrolurch (Gast)


Lesenswert?

Danke schon mal.
Aber meine Definition müsste also korrekt sein?
Der Compiler bringt aber folgende Fehlermeldung:
Array type has incomplete element type char[]".

von Klaus W. (mfgkw)


Lesenswert?

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
von Klaus W. (mfgkw)


Lesenswert?

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
von Elektrolurch (Gast)


Lesenswert?

@ 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
Noch kein Account? Hier anmelden.