Forum: Mikrocontroller und Digitale Elektronik Mehrdimensionales Array char/int


von Gerd (Gast)


Lesenswert?

Hallo,

ich versuche mich derzeit an Mehrdimensionalen arrays in c. (PIC 
Mikrocontroller, C18 Compiler)


Ich bin nachdem ich den Artikel über Strings und Mehrdimensionale Arrays 
gelesen habe davon ausgegangen, dass die Zahl in der 1. Klammer im 
prinzip die "Adresse" im array ist und die Zahl in der 2. Klammer der 
für den String zur verfügung stehende Platz darstellt. Ich glaube da 
liege ich falsch.

Was ich vor hab: Ein Array in dem verschiedene Strings gespeichert sind 
die ich dann mittels über das Array aufrufen kann.

BYTE Befehl[2][16];

strcpypgm2ram(Befehl[0][0],"Aus");
strcpypgm2ram(Befehl[1][0],"An");
strcpypgm2ram(Befehl[2][0],"Stop");
...usw.



Hat von euch einer eine idee?

von Rene H. (Gast)


Lesenswert?

1
char Befehl[3][16] = {"Aus", "An", "Stop"};

Wenn Du nur einen String möchtest, hast Du ja:
1
char Befehl[16];

Nun kommt nur noch das Array hinzu. Siehe oben.

Grüsse,
René

von Peter II (Gast)


Lesenswert?

Gerd schrieb:
> Hat von euch einer eine idee?

zeichen speichert man nicht in bytes. Dafür gibt es char.

wenn du 2 Dimensionen brauchst, dann brauchst du auch mindestnes 2 werte 
dafür. Damit ist auch klar war die [] zu bedeuten haben.

Und wenn jetzt noch Strings gespeichert werden sollen, dann muss als 
Datentype char* nehmen.

damit ergibts sich

char* Befehl[2][16];

das hat aber den nachteil das man den Speicherplatz für den String erst 
besorgen muss. Wenn man die maximale länge des Strings kennt kann man es 
auch so machen.

char Befehl[2][16][maxlen];

damit wird aber immer der speicher für die Maximale länger verbraucht.
Brauchst du denn überhaupt eine Mehrdimensonales array ist machst du das 
nur wegen dem string?

von Michael (Gast)


Lesenswert?

Gerd schrieb:
> dass die Zahl in der 1. Klammer im
> prinzip die "Adresse" im array ist und die Zahl in der 2. Klammer der
> für den String zur verfügung stehende Platz darstellt. Ich glaube da
> liege ich falsch.

Kann man sich schon so vorstellen. Wobei man das ganze auch vertauschen 
kann, aber tut nichts zur Sache.
Wie genau war dann aber deine Frage?

von Michael (Gast)


Lesenswert?

Peter II schrieb:
> char* Befehl[2][16];

Nicht ganz... Im Beispiel des TO wird Befehl[0][0] - Befehl[2][0] 
verwendet, deshalb eher wohl
1
char* Befehl[3][16];

Wobei die 16 die maximale Zeichenzahl pro String inkl. abschließender 
Null darstellen wird, also nicht auf eine dritte Dimension aufgeblasen 
werden muss

Peter II schrieb:
> char Befehl[2][16][maxlen];

also resultierend:
1
char* Befehl[AnzahlStrings][AnzahlZeichen+1];

von Peter II (Gast)


Lesenswert?

Michael schrieb:
> also resultierend:
> char* Befehl[AnzahlStrings][AnzahlZeichen+1];

dann ist aber der * falsch

char Befehl[AnzahlStrings][AnzahlZeichen+1];

von Michael (Gast)


Lesenswert?

Richtig ;)

von DirkB (Gast)


Lesenswert?

Gerd schrieb:
> Ich bin nachdem ich den Artikel über Strings und Mehrdimensionale Arrays
> gelesen habe davon ausgegangen, dass die Zahl in der 1. Klammer im
> prinzip die "Adresse" im array ist und die Zahl in der 2. Klammer der
> für den String zur verfügung stehende Platz darstellt.

Im Prinzip schon.
Allerdings gibt die Zahl in den [] bei der Definition des Array die 
Anzahl der Elemente an.
Beim Zugriff auf das Array fängt die Zählung bei 0 an. Somit ist der 
Index vom höchsten Element um eins niedriger als die Zahl bei der 
Definition.

Bei
1
char Befehl[2]
hast du als ein Array mit zwei Elementen, die du über die Indizes 0 und 
1 ansprechen kannst.

Das strcpypgm2ram erwartet als ersten Paramter einen Zeiger auf das 
Array.
Darum musst du der Variable den Adressoperaqtor & voran stellen.
1
strcpypgm2ram(&Befehl[0][0],"Aus");

Es geht auch ohne den zweiten Index. Das gibt dann gleich die Adresse 
(Daher ohne &).
1
strcpypgm2ram(Befehl[0],"Aus");

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.