Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

einleitung:arrays

Arrays

Ein Array (auch „Feld“ genannt) kann man sich wie eine Tabelle vorstellen, die nummerierte Eintrage hat.

Platz Inhalt
0 3
1 1
2 7
3 8
4 2
5 1

In dieser Tabelle gibt es sechs Eintrage. An der 0. Stelle steht eine 3, an der 1. Stelle steht eine 1, usw. Wichtig ist, dass die Nummerierung bei 0 beginnt. Es kann auch zweidimensionale Arrays geben (z.B. um eine Tabelle aus x- und y-Koordinaten abzulegen), dreidimenstionale usw. Im Folgenden beschränken wir uns auf eindimensionale Arrays.

1. Deklaration und Zugriff beim Arduino

Um so ein Array bei dem Arduino anzulegen, muss folgender Code geschrieben werden:

int zahlen[] = {3,1,7,8,2,1};

Die Klammern [] stehen dafür, dass die Variable zahlen auf ein Array zeigt und nicht auf eine einzelne Variable. Das Schlüsselwort int steht dafür, dass das folgende Array nur Integer-Werte beinhaltet. Ein Array kann also nur einen Datentyp enthalten. Um ein Array mit Werten zu füllen, kann die Variante oben verwendet werden. Mit {3,1,7,8,2,1} werden die Zahlen der Reihe nach in das Array geschrieben und somit ein Array der Länge 6 erstellt. Achtung: Arrays sind statisch, das bedeutet, dass die Länge, nachdem es angelegt wurde, nicht mehr geändert werden kann.

Man muss jedoch nicht beim deklarieren gleich Werte angeben.

int zahlen[6];

Auch hier wird ein Array der Länge 6 erzeugt. Wenn man an dieser Stelle den Inhalt des Arrays auf dem Seriellen Monitor ausgibt, bekommt man Zahlen, die willkürlich aussehen. Dies liegt daran, dass an den jeweiligen Stellen im Speicher vorher andere Werte abgelegt wurden, die wir noch nicht überschrieben haben.

Auf den ersten Eintrag kann man wie folgt etwas schreiben:

zahlen[0] = 3

So kann in jede Stelle das Arrays geschrieben werden und auch jeder Wert überschrieben werden. Wenn ein Wert ausgelesen und gespeichert werden soll, dann kann man dies wie folgt machen:

int x = zahlen[1]

Auf die letzte Stelle des Arrays kann man auch so zugreifen:

int zahlen[] = {3,1,7,8,2,1};
int arrayLaenge = sizeof(zahlen)/sizeof(zahlen[0]); // alternativ: sizeof(zahlen)/2
// Hier wird die Größe des Platzes, den das Array im Speicher annimmt, 
// durch die Größe eines Elementes geteilt. 
int letztesElement = zahlen[arrayLaenge-1]; 
// Wichtig: der letzte Index ist um 1 kleiner als die Array-Länge.

In C++/Arduino wird euch der Compiler nicht daran hindern, auf einen Index zuzugreifen, der größer ist als die Länge des Arrays. Wenn ihr diese Stellen im Speicher überschreibt, die nicht zu eurem Array gehören, kann es zu unerwünschten Auswirkungen führen. (In Java/Processing ist das anders: ihr bekommt in diesem Fall einen Fehler beim Kompilieren.)

Eine gute Zusammenstellung bekommt ihr auch in der Arduino Referenz.

Ein funktionierendes Beispiel mit Arrays findet ihr z.B. unter Beispiele=>Digital=>ToneMelody.

Oder wir können mit Hilfe von Arrays euren Servo dazu bringen, mehrere vorgegebe Positionen anzunehmen (z.B. bei einem Gießroboter, der Blumen abwechselnd in Richtungen 30, 45, 90 und 150 Grad gießen soll):

#include <Servo.h>
int servoPin = 2; 
Servo motor;
int positions[] = {30, 45, 90, 150};
 
void setup() {
  Serial.begin(9600);
  motor.attach(servoPin);
}
 
void loop() {
  for (int i = 0; i < sizeof(positions)/sizeof(positions[0]); i++) {
    motor.write(positions[i]);
    delay(1000);
  }
  delay(1000);
}

2. Schachbrett: Ein Beispiel mit einem zweidimensionalen Array

Stellen wir uns vor, wir wollen jetzt einen Schachroboter bauen. Dafür wollen wir u.A. das Schachbrett mit seinen Farbwerten (weiß oder schwarz) für jedes Feld initialisieren und abspreichern. Dafür brauchen wir ein zweidimensionales Array in der Größe 8×8. Dieses Array wird vom Typ boolean sein (weiß = true, schwarz = false). Wir legen dieses Array so an:

boolean brett[8][8];

Jetzt können wir dieses Array mit Werten auffühlen und diese ausgeben. Auf die einzelnen Stellen können wir mit Hilfe einer geschachtelten for-Schleife zugreifen.

void setup() {
  Serial.begin(9600);
 
  boolean brett[8][8]; // das Schachbrett
 
  boolean istWeiss = true; // zeigt, ob die schwarze oder weisse Farbe dran ist
  // Das Array mit Werten füllen:
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      brett[i][j]= istWeiss;
      istWeiss = !istWeiss; // den Farbwert umkehren
    }
    istWeiss = !istWeiss; // am Ende der Zeile den Farbwert nochmal umkehren
  }
 
  // Das Array ausgeben:
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 8; j++) {
      Serial.print(brett[i][j]);
    }
    Serial.println(); // Zeilenumbruch am Ende einer Zeile
  }
}
 
void loop() {
 
}
einleitung/arrays.txt · Zuletzt geändert: 2018/05/09 19:19 von d.golovko