2dimensionales Array auslesen

Hallo,

ich breuchte mal wieder eure Hilfe.
Wie muß ich es anstellen daß folgendes passiert.
x und y sollten der Reihe nach die Werte aus dem Array übergeben werden.
Also x=0 y=0 dann x=1 y=1 dann x=2 y=1 dann x=3 y=1 ....

int x=0;
int y=0;
int z=0;

byte uv[20][20] = { {0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,2,0,1,1,1}, {0,1,1,1,0,1,2,2,0,1,2,3,0,1,2,3,0,1,2,3}};

void setup()
{
Serial.begin(9600);
}

void loop() 
{
 for (z=0;z<21;z++)
 {
 x=uv[z][0];  // ???
 y=uv[z][1];  // ???
 Serial.print ("x= ");
 Serial.print (x);
 Serial.print ("  y= ");
 Serial.println (y);
 }
 delay(20000);
}

Ich bitte um eure Hilfe.

Tschüß
der Lokgeist

2dimensionales Array auslesen

Du meinst sicherlich zwei eindimensionale Arrays?
Oder so ähnlich...

Denn:
uv[20][20] sind nach meiner bescheidenen Rechnung 400 Elemente.
Das scheint mir doch nicht das Gewünschte zu sein....

Lokgeist:
Wie muß ich es anstellen daß folgendes passiert.
x und y sollten der Reihe nach die Werte aus dem Array übergeben werden.
Also x=0 y=0 dann x=1 y=1 dann x=2 y=1 dann x=3 y=1 ....

byte uv[2][20] = { 
  {0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,2,0,1,1,1}, 
  {0,1,1,1,0,1,2,2,0,1,2,3,0,1,2,3,0,1,2,3}
};

void setup()
{
  Serial.begin(9600);
  Serial.println("Array ausgeben:");
  char buf[20];
  for (int y=0;y<2;y++)
  {
    for (int x=0;x<20;x++)
    {
      int value=uv[y][x];
      snprintf(buf,sizeof(buf),"x=%d y=%d value=%d",x,y,value);
      Serial.println(buf);
    }
  }   
}

void loop() 
{
}

Eigentlich fast richtig.

Dein Array ist nicht 20*20 sondern:

byte uv[2][20] = { {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 2, 0, 1, 1, 1},
                 {0, 1, 1, 1, 0, 1, 2, 2, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3}   };

Und abfragen tust du es mit:

for (z = 0; z < 20; z++) {
 x = uv[0][z]; 
 y = uv[1][z]; 
}

Du hattest nur die Koordinaten vertauscht.

Tip zum Test: belege jeden Arrayplatz mit einem eigenen Wert, dann siehst du, welcher Platz ausgegeben wird. z.B.
byte uv[2][20] = { {0, 1, 2, 3, 4, ...,19},
{20, 21, 22, 23, .. , 39} };

oder du machst es mit zwei eindimensionalen Arrays

int x=0;
int y=0;
int z=0;

byte u[21] =  {0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,2,0,1,1,1};
byte v[21] =  {0,1,1,1,0,1,2,2,0,1,2,3,0,1,2,3,0,1,2,3};

void setup()
{
Serial.begin(9600);
}

void loop()
{
for (z=0;z<21;z++)
 {
 x=u[z];  // ???
 y=v[z];  // ???
 Serial.print ("x= ");
 Serial.print (x);
 Serial.print ("  y= ");
 Serial.println (y);
 }
 delay(1000);
}

Warum 21?

byte u[21] = ...

Ich zähle nur 20.

guntherb:
Warum 21?Ich zähle nur 20.

dann hat er noch Luft nach oben :slight_smile:

Man muss ja nicht alle Werte vorbelegen. So hat er noch Platz um ein Byte reinzuschreiben.
War aber bestimmt nicht so beabsichtigt :wink:

ardubu:
oder du machst es mit zwei eindimensionalen Arrays

Dann kann man das Array aber später in der Reallife Anwendung nicht mit verschachtelten Schleifen auslesen

Hallo,

nun bin ich vom Einkauf wieder zurück und überrascht. In so kurzer Zeit so viele Antworten. :slight_smile:
Die Antwort von Gunther kommt meinem Anliegen am besten entgegen.

Habt alle recht herzlichen Dank. :open_mouth:
Der Lokgeist

Warum 21?
Quote

byte u[21] = ...

Ich zähle nur 20.

da er z von 0 bis 20 laufen läßt und 20 ist das 21ste Element des Arrays

for (z = 0; z < 20; z++)

In dieser Schleife hat z die 20 Werte 0 .. 19 und das passt wunderbar als Index auf

byte u[20];

Gibt sogar Leute die schreiben

byte u[] = {0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,2,0,1,1,1}; 
...
for (byte z = 0; z < sizeof(u); z++) {
  verwende (u[z]);
}

Statt zweidimensionaler Arrays ist es auch nett, in Datenstrukturen zu denken.
Jedes der z.B. 20 Elemente besteht dann aus einem Zahlenpaar:

struct {byte x; byte y;} punkte[] = {
{0,0}, {3,2}, {1,2}
}

der 1. post

void loop()
{
for (z=0;z<21;z++)
{
x=uv[z][0]; // ???
y=uv[z][1]; // ???
Serial.print ("x= ");

und das sind für mich 21 Elemente

Naja, deklariert hat er 20, ausgelesen hat er 21. Das gibt eigenartige Ergebnisse

Hallo noch mal zusammen.

Ist ja toll wie MEIN Fehler noch für eine Denkakrobatik führen kann und dann somit auch noch weitere Möglichkeiten meiner Fragestellung hervorbringt.
Die mir als Leihe :o und Anfänger :confused: und älterer Herr >:( und Rentner :slight_smile: allerdings mein Gehirn :roll_eyes: überstrapaziert.

Besten Dank
Der Lokgeist

überstrapaziert.

Schlichte Mathe?
4te Klasse Grundschule.

Neee...
Das ist der Altersstarrsinn!

Eine Blockadehaltung.

Tipp:
Wer sagt "Ich bin zu alt um das noch zu lernen..", der ist wirklich alt.
Und das hat überhaupt nichts mit dem Lebensalter zu tun.
:smiling_imp:

Auf deinem Avatarbild kommst du mit höchstens 73 rüber :wink:

Hallo ElEspanol,

sollte ja auch eher was zum Schmunzeln sein. Deswegen auch die vielen Smileyes. Wie deines. :wink:

Lokgeist