Zweidimensionales Array umbauen, aber wie?

Hallo an alle.

Ich habe ein zweidimensionales Array angelegt " byte inStr[5][255] = {0} ; ". Dieses Array ist ein zentrales Element in meinem Programm und deshalb gibt es auch sehr viele schreib- und lesezugriffe darauf. Teils über " inStr[a] ```c **  =  b;[/b] " ; teils über " [b]d = inStr[4][69];[/b] " oder es wird [b]a[/b] und [b]c[/b] in Schleifen hoch oder runtergezählt.

Wegen der Größe des Arrays geht mir nun langsam der freie RAM-Bereich aus. Ich brauche aber nicht wirklich in allen zeilen des Arrays 255 byte.

Wie kann ich ein Array definieren auf das ich nach wie vor über [b]inStr[a][c][/b] zugreifen kann, wobei aber Zeile 1, 2 und 3 nur je 30 Byte reservieren während Zeile 4 und 5 eine Länge von 255 Byte haben soll.

Ein zerlegen des zweidimensionalen Array in 5 fünf eindimensionale Arrays wäre eine Möglichkeit, aber die hätte leider umfangreiche Änderungen im Programmcode zu Folge.

Gruß peter** ```

Welchen Arduino hast Du? Beschreibe Dein Problem genauer. Wenn Du nicht alle Elemente des 5x255 Arrays brauchst (bist Du sicher daß es kein 5x256 Array ist?) Dann müssen wir mehr Infos haben um Dir helfen zu können. Grüße Uwe

Hallo Uwe, Ich habe einen Arduino UNO.

Ich denke es ist richtig, dass das Array 5*255 Byte groß ist. byte x[30]; ergibt eine Variable mit 30 Byte welche über die Adressen 0...29 angesprochen werden können.

Das Problem genauer zu beschreiben fällt mir irendwie schwer, ich versuche es mal anders zu beschreiben. Das Array ist jetzt 5*255 Byte groß und hat [u]einen[/u] Namen über den ich jedes Byte ansprechen kann - Name (x,y). Wirklich brauche ich aber nur ein Array das 3*30 Byte + 2*255 Byte groß ist.

Wie kann ich ein solches Array so definieren daß es auch weiterhin nur über einen Variablenamen ansprechbar ist?

wenn ich: byte inStr_A[30]; byte inStr_B[30]; byte inStr_C[30]; byte inStr_D[255]; byte inStr_E[255]; schreibe, habe ich genau das definiert was ich brauche. Aber eine Adressierung über Name (x,y) ist nicht mehr möglich weil es jetzt 5 Arrays mit 5 verschiedenen Namen sind.

Vielleicht ist mein Problem so verständlicher beschrieben. Ich möchte drei der fünf Arrays kleiner machen weil ich dort nur 30 statt 255 Byte brauche um RAM zu sparen. Ich möchte aber auch das gesamte Array weiterhin über einen Namen (und nicht fünf ) ansprechen können um nicht das ganze Programm ändern zu müssen.

Gruß peter

Das nennt sich “jagged array”

Du fügst einfach die Teil-Arrays in ein Array aus byte* ein, da Arrays nicht anderes als Zeiger auf das erste Element sind:

byte inStr_A[30];
byte inStr_B[30];
byte inStr_C[30];
byte inStr_D[255];
byte inStr_E[255];

byte* inStr[] = { inStr_A, inStr_B, inStr_C, inStr_D, inStr_E };

Dann geht die Indizierung genauso über

Danke !!!

byte* inStr[] = { inStr_A, inStr_B, inStr_C, inStr_D, inStr_E };

das ist die Lösung die ich gesucht hatte

Gruß peter

Was müsste ich dann beispielsweise eingeben, wenn ich über inStr von inStr_A den zweiten Index auslesen wollen würde?

Gruß Chris

 byte x = inStr[0][1];

Das ist ja einfach! :)

Daaanke!

Gruß Chris