Brauche Hilfe für Array in Array

in meiner funktion geht das darum eine liste mit freien feldern (koordinaten) eines spielfeldes zu erstellen. Frei bedeutet Feldwert 99.
Nun verzweifele ich eine solche Liste zu realisieren. Hat hier jemand einen guten Tip, oder zumindest eine Erklärung für die Fehler die er meldet? Ich komme einfach nicht weiter.

  struct FELD {
    int x;
    int y;
  }
  
  FELD kachel={99,99} 
  int liste[]=kachel;
  
  int i=0;
  for (int spalte=0;spalte<5;spalte++){
          for (int zeile=0;zeile<5;zeile++){
              if (pos[spalte][zeile]==99 ){
                
                liste[i]=(FELD){spalte,zeile};
                i++;
                randomSeed(analogRead(0));
                //pos[spalte][zeile]=random(0,1); // zufälligen buchstab in leerfeld ablegen
              }
          }
  }
  Serial.print("Anzahl leerfelder:");
  Serial.print(i);
  Serial.print("\n");
  
  Serial.print("Anzahl Möglichkeiten in Liste:");
  Serial.print( sizeof(liste) );
  Serial.print("\n");

dazu meldet er:

MeikeV0.1.ino:311:8: error: expected initializer before 'kachel'
MeikeV0.1.ino:312:15: error: 'kachel' was not declared in this scope
MeikeV0.1.ino:319:25: error: cannot convert 'seedLetter()::FELD' to 'int' in assignment

Mit Semikolons sind erstmal deine Fehlermeldungen weg.

Und ein Zweidimensionales Array von Kacheln geht natürlich auch, nur nicht als int Array sondern als

FELD liste[5][5];

Fragt sich aber, ob das sinnvoll ist. (Was soll x und y bedeuten?)

int liste[]=kachel;

Für was soll das gut sein? Wenn du ein Array möchtest, nimm ein Array aus structs

Großbuchstaben sind übrigens für Konstanten

Vielen Dank für die Rückmeldungen & Hinweise!
Ich habe es dank euch nun fehlerfrei umsetzen können, allerdings ist das Ergebnis Müll.
Ist schon seltsam das er beim Schleifendurchlauf auf 100 kommt, statt auf 25 (5*5).
Und in der Liste sollten nur die Werte der Koordinaten (0-4) zu finden sein (da 5 Spalten und 5 Zeilen).

Es wäre schön, wenn ihr nochmal einen Tip geben könntet.

Hier nochmal mein Code:

  struct FELD {
    int x;
    int y;
  };
  typedef struct FELD Kachel;
  Kachel kachel; 
  FELD liste[25];
  
  int i=0;
  for (int spalte=0;spalte<5;spalte++){
          for (int zeile=0;zeile<5;zeile++){
              if (pos[spalte][zeile]==99 ){
                kachel.x = spalte;
                kachel.y = zeile;
                liste[i] = kachel;
                i++;
              }
          }
  }
  Serial.print("Anzahl leerfelder:");
  Serial.print(i);
  Serial.print("\n");
  
  Serial.print("Anzahl Möglichkeiten in Liste:");
  Serial.print( sizeof(liste) );
  Serial.print("\n");
  
  Serial.print("Debug Dump-Liste:\n");
  if (sizeof(liste)>0){
    for (int u=0;u<sizeof(liste);u++ ){
      Serial.print("u:");
      Serial.print(u);
      Serial.print(":");
      kachel=liste[u];
      Serial.print( kachel.x,kachel.y );
      Serial.print("\n");
    }
  
  //randomSeed(analogRead(0));
  //pos[spalte][zeile]=random(0,1); // zufälligen buchstaben in leerfeld ablegen
  }

und hier die serielle Ausgabe dazu:

Anzahl leerfelder:25
Anzahl Möglichkeiten in Liste:100
Debug Dump-Liste:
u:0:
u:1:0
u:2:0
u:3:0
u:4:0
u:5:
u:6:1
u:7:1
u:8:1
u:9:1
u:10:
u:11:2
u:12:10
u:13:2
u:14:2
u:15:
u:16:3
... weiter bis :
u:98:28279
u:99:2B€

Deine Ausgabe ist falsch:

// Dein Code
Serial.print( kachel.x,kachel.y );
// besser
Serial.print( kachel.x );
Serial.print( kachel.y );

Gruß Tommy

Ist schon seltsam das er beim Schleifendurchlauf auf 100 kommt

sizeof (Liste) ist nunmal 100 : 25 mal 4 Byte

DANKE! Funktioniert wunderbar! :slight_smile:

Funktioniert wunderbar

Schön!
Aber wenn du nun noch verrätst, was du in den 100 Byte abspeicherst und warum ...

sizeof() liefert dir immer die Größe in Bytes. Nicht die Anzahl der Elemente

Hi

Serenifly:
sizeof() liefert dir immer die Größe in Bytes. Nicht die Anzahl der Elemente

geteilt durch die Größe des Datentyp aka sizeof(int) (was zwei wäre, da jeder Listenelement aber zwei davon hat, insgesamt vier Bytes ausmacht).

MfG

Standardlösung:

#define ELEMENTCOUNT(x) ( sizeof(x) / sizeof(x[0]) )

Verwendung:

FELD liste[25];
   ...
   Serial.println(ELEMENTCOUNT(liste));  // Ausgabe : 25

Mit allen Fehlermeldungsproblemen bei falscher Verwendung, die nunmal bei #define passieren können