2 Dimensionale Arrays - Multidimensionale Arrays

Hallo,

Vielleicht kann mir da jemand bitte weiterhelfen. Ich schaffe es einfach nicht ein 2D Array zu erstellen oder auszulesen.

#define sp Serial.print
#define spl Serial.println
const byte leds[5][3] = {{0, 4, 0}, {1, 5, 0}, {2, 6, 1}, {3, 7, 0}, {4, 8, 1}};

/*
 * LED  Pin State
 * 0    4   0
 * 1    5   0
 * 2    6   1
 * 3    7   0
 * 4    8   1
 */

void setup() {
  Serial.begin(9600);
  Serial.println("LED Spiel starte...");

  for(byte led:leds) { // ersetzt for(byte led, i=sizeof(leds), i++)
    sp(led); // <- Warum bleibt das Sketch in der loop stecken?
    sp(" - ");
    sp(leds[led][0]);
    sp(" - ");
    sp(leds[led][1]);
    sp(" - ");
    spl(leds[led][2]);
  }
  spl();
  for(byte i; i<5; i++) { // Nur so funktioniert es wie ich will
//  for(byte i; i<sizeof(leds); i++) { // <- zeigt mir 3x5 Spalten, mit eigenartigen Werten
// for(byte i; i<sizeof(leds[0]); i++) { // <- Zeigt mir nur 3 Spalten

    sp(i);
    sp(" - ");
    sp(leds[i][0]);
    sp(" - ");
    sp(leds[i][1]);
    sp(" - ");
    spl(leds[i][2]);

  }

}
void loop() {
  delay(1); // Damit er sich auch ausruhen darf, während er seine Kreise zieht.
}

Wenn ich sizeof() oder ‘byte led:leds’ in der for Schleife verwende bekomme ich folgende Ausgabe:

18 - 0 - 232 - 3
21 - 197 - 0 - 196
24 - 0 - 198 - 0
27 - 0 - 0 - 0
30 - 0 - 0 - 0

Die erste Zahl ist i, also die Zähler Variable der for Schleife.

Ich möchte das endlich verstehen, ich glaube ich habe da einen Denkfehler. Wäre nett wenn mir jemand auf die Sprünge helfen kann.

Irgendwie wenig Text für eine Frage :o Falls ich etwas vergessen habe verzeiht mir bitte, ich war in den letzten Wochen nirgends aktiv (Computerprobleme). Wird wohl auch noch ein bissi dauern bis alles wieder so läuft wie es einmal war.

Grüße,
Donny

Mehreres :

led wird in deine For-Schleife nicht initialisiert !
also wenn schon for (led = 0 ; led < 5 ; led++).

Das eine Stack Variabel mit 0 initialisiert kann man nicht voraussetzen.
Ich würde led auch nicht in den Vorschleife deklarieren, aber das ist Geschmackssache.
Ich habe da schon diverse Unterschiede von C/C++ Compiler gesehen welch Variable
gerade “sichtbar” ist. Im for bist du ja eigentlich noch nicht in der {.

Die Schleife bis sizeof laufen zu lassen ist bei dir auch falsch.
Du hast ja 5 * 3 Elemente das sind 15 und da byte nur ein Byte braucht liefert sizeof 15 !

Wäre das Array von Type short int würde sizeof 30 liefern.
Wie am Anfang deine C++ “Abkürzung” mit dem quadratischen Array korrekt formuliert
werden müsste müsste ich mir erst überlegen.
Aber einfach Sizeof wir darin mit Sicherheit auch nicht benutzt weil die Größe des Grundtypes ja
reinspielen muß (also sowas wie sizeof(leds) / sizeof (byte) )

Ulli

warning: invalid conversion from 'const unsigned char*' to 'byte {aka unsigned char}' [-fpermissive]

Wenn du überbyte leds[][3]iterierst, sind die Einzelelemente jeweils einbyte led[3] oder auch byte*

Mir sind zweidimensionale Arrays zu kompliziert, denn meist sind es auch gar keine, sondern eher eindimensionale Arrays von Elementen, die ihrerseits etwas komplexeres als eine einzelne Zahl sind. Ob die Unterelemente nicht besser als struct definiert wären, bleibt immer zu überlegen.

/* * LED Pin State * 0 4 0 * 1 5 0 * 2 6 1 * 3 7 0 * 4 8 1 */

Da sind Äpfel mit Tomatenketchup vermischt!

LED scheint ein Index zu sein. Da jedes C++ Array schon einen Index hat ist das eine redundante Information. Pin ist ein Byte, oder? State ein bool, oder?

Also, mein Tipp:

struct Led 
{
  byte pin;
  bool state;
};

const Led leds[] = { {4, 0}, 
                     {5, 0}, 
                     {6, 1}, 
                     {7, 0}, 
                     {8, 1},
                   };

Oder etwas aufgeblasener:

struct Led : Printable
{
  byte pin;
  bool state;
  
  Led(const byte pin,const bool state):pin(pin),state(state){}
  
  size_t printTo(Print &printer) const
  {
    size_t len = 0;
    len += printer.print("Pin: ");   len += printer.println(pin);
    len += printer.print("State: "); len += printer.println(state);
    return len;
  }
};

Led leds[] = { 
                {4, 0}, 
                {5, 0}, 
                {6, 1}, 
                {7, 0}, 
                {8, 1},
             };

void setup() 
{
  Serial.begin(9600);
  Serial.println("Start");
  
  for(Led &led:leds) Serial.println(led);
}

void loop() 
{

}

Hallo,

Vielen Dank für die schnellen und guten Antworten! Jetzt ist mir schon einiges klarer. :)

combie: LED scheint ein Index zu sein. Da jedes C++ Array schon einen Index hat ist das eine redundante Information. Pin ist ein Byte, oder? State ein bool, oder?

Ja, Ja und Ja ;) Stimmt, die kann ich rausnehmen.

Im Prinzip ist es eine Spielerei weil ich einfach lernen möchte. Aber ich habe mir das so vorgestellt: In einer Tabelle/Datenbank würde das so ausschauen:

| Index (ID) | Led Pin (byte) | Status(bool) | Eingang?(bool) | | - | - | - | - | | 0 | 4 | 1 | 1 |

Led0 ist am Pin 4 angeschlossen und hat den Status 1 also sie leuchtet. Ich hab noch hypotetisch eine Spalte eingefügt damit man zB sagen kann ob es sich um einen Taster oder LED handelt aber das geht vielleicht doch ein bischen zu weit.

Also da wird es echt zu kompliziert deshalb:

combie: Also, mein Tipp:

Vielen Dank! Jetzt habe ich wieder etwas zum grübeln. ;) Und die 2 Spalten machen IMO in der Praxis Sinn.

Grüße, Donny

Und wenn du dich weiterhin mit n Dim Arrays rum schlagen möchtest:

const byte leds[][3] = {{0, 4, 0}, {1, 5, 0}, {2, 6, 1}, {3, 7, 0}, {4, 8, 1}};

const size_t firstDimCount  = sizeof(leds)/sizeof(leds[0]);
const size_t secondDimCount = sizeof(leds[0])/sizeof(leds[0][0]);

void setup() 
{
  Serial.begin(9600);
  Serial.println("Start");
  Serial.println(firstDimCount);
  Serial.println(secondDimCount);

  for(int i = 0; i<firstDimCount;i++)
  {
    for(int j = 0; j<secondDimCount;j++)
    {
      Serial.print(leds[i][j]);
      Serial.print(" ");
    }
    Serial.println();
  }
}

void loop() 
{

}

combie: Und wenn du dich weiterhin mit n Dim Arrays rum schlagen möchtest:

Super, Danke!

Ich nehm alles was ich kriegen kann und saugs auf. ;) Ich mein, es gibt IMHO zu wenige Arduino spezifische Beispiele. Natürlich gibt es für C++ genug Beispiele. Aber ich bin erst durch das Arduino auf C++ gekommen.

Grüße, Daniel

dony: Ich mein, es gibt IMHO zu wenige Arduino spezifische Beispiele

Braucht man bei sowas nicht. Das einzige was da Arduino spezifisch ist ist die serielle Ausgabe

Ich halte es für Anfänger auch sinnvoll solche elementaren Sachen auf einem PC auszuprobieren wo man Debuggen kann und dadurch schön sieht was abläuft.

Serenifly: Braucht man bei sowas nicht. Das einzige was da Arduino spezifisch ist ist die serielle Ausgabe

Ja ich sollte mich bei sowas mehr auf C++ Seiten aufhalten. Da hast Du Recht!

Grüße, Donny