Lektion 15 – Array

Der Programmtext aus dem letzten Beispiel ist ziemlich lang, obwohl ständig fast die gleichen Befehle wiederholt werden. Das geht auch leichter – mit dem Array.

Ein Array ist eine spezielle Art der Variable. Sie kann gleich mehrere Werte speichern.

Stell Dir ein Array wie ein Containerschiff vor. Die Container sind nummeriert und wenn man in einen hinein sehen möchte, muss man die Nummer mit angeben. Die Nummern der Container fangen bei 0 an, was manchmal zu Verwirrung führt.

Array als Containerschiff Funktionsprinzip

Auch ein Array muss angelegt (deklariert) werden. Dazu gibt es mehrere Möglichkeiten.

So deklariert man ein leeres Array ohne Wertzuweisung.

int zahlen[6];

Hier wird ein Array mit dem Namen zahlen angelegt. Der Variablentyp ist int. Arrays können immer nur Werte vom gleichen Typ speichern. Hier also ganzzahlige Werte. Die 6 in den eckigen Klammern bedeutet, dass sozusagen das Array-Containerschiff sechs Container hat. Man nennt das die Länge des Arrays.

Array ohne Wertzuweisung anlegen

Eine andere Möglichkeit ein Array anzulegen, geht so:

int zahlen[] = {10, 78, 45, 67, 38, 14};

Hier werden dem Array Werte direkt zugewiesen und deshalb muss man die Länge das Arrays nicht extra in die eckigen Klammern schreiben. Auf der Tastatur findest du die eckigen Klammern übrigens beim PC mit Alt-Gr + 8 und Alt-Gr + 9, am Mac mit Alt + 5 und Alt + 6. Wie lang ist denn das Array? Genau: 6.

Array mit Wertzuweisung anlegen

Wie weist man aber Werte dem Array zu? Eigentlich genau so, als würde man sie in eine normale Variable schreiben, nur dass die Stelle im Array, in die wir schreiben wollen, angegeben werden muss.

zahlen[3] = 50;

in Array schreiben

Bleibt noch die Frage, wie man Werte aus dem Array ausliest. Sagen wir beispielsweise, wir möchten den Wert an der vierten Stelle (also Stelle 3) in die Variable a schreiben.

a = zahlen[3];

Array auslesen

In der letzten Lektion haben wir Tonfrequenzen abgespielt. Dazu haben wir die gleichen Befehle einfach kopiert. Jetzt wollen wir die Tonhöhen diesmal in ein Array übertragen. Wir bleiben zunächst bei dem kurzen Beispiel:

int frequenzen[] = {262, 294, 330, 349, 392, 392};

Gut. Wir haben ein Array vom Typ int angelegt. Es heißt frequenzen und speichert die Tonhöhen unserer Melodie. Um einen einzelnen Wert aus dem Array zu bekommen kann man einfach auf die Stelle zugreifen:

frequenzen[0] ergibt 262
frequenzen[1] ergibt 294
frequenzen[5] ergibt 392

Wir benutzen das Array also genau wie jede andere Variable, nur dass wir noch die Stelle mit angeben müssen.
Für die Melodie ist aber auch die Dauer der Töne von großer Bedeutung. Also speichern wir diese auch:

int tonDauer[]= {200, 200, 200, 200, 400, 400};

Die Länge der Arrays sollte auf jeden Fall gleich sein. Um nun alle Töne zu spielen, brauchen wir eine for-Schleife. Die Zählervariable zählt, welcher Ton gerade gespielt werden soll und übergibt das an die Arrays:

int frequenzen[] = {262, 294, 330, 349, 392, 392};
int tonDauer[]= {200, 200, 200, 200, 400, 400};
int tonAnzahl = 6;

void setup() {

}

void loop() {
  for (int ton=0; ton<tonAnzahl; ton=ton+1){
    tone(9, frequenzen[ton]);
    delay(tonDauer[ton]);
    noTone(9);
    delay(tonDauer[ton]);
  }
}

Der Code ist doch schon viel kleiner geworden. Wie ist das, wenn die ganze Melodie gespielt werden soll? Versuch es mal selbst.

Lösung hier:

int frequenzen[] = {262, 294, 330, 349, 392, 392, 440, 440, 440, 440, 392, 440, 440, 440, 440, 392, 349, 349, 349, 349, 330, 330, 392, 392, 392, 392, 262};
int tonDauer[]= {200, 200, 200, 200, 400, 400, 200, 200, 200, 200, 800, 200, 200, 200, 200, 800, 200, 200, 200, 200, 400, 400, 200, 200, 200, 200, 800};
int tonAnzahl = 27;

void setup() {

}

void loop() {
  for (int ton=0; ton<tonAnzahl; ton=ton+1){
    tone(9, frequenzen[ton]);
    delay(tonDauer[ton]);
    noTone(9);
    delay(tonDauer[ton]);
  }
}

Hast du weitere Fragen? Probier doch mal unser brandneues Forum zu Arduino aus!

7 thoughts on “Lektion 15 – Array

  1. zum glück bin ich eigentlich mit dem Thema hier schon durch an sich aber ne schön gemachtes tut…
    besonders das auch auf die Nutzung von arrays in Verbindung mit for schleifen eingegangen wird fand ich gut.

    aber mal zur Qualitätskontrolle ;P beim vorletzten Containerschiff bild „Zuseisen“? scheint mir eigentlich Zuweisen zu heißen :) text in Bildern vielleicht besser kontrollieren ärgerlich da typos zu haben :/ und ka wieso aber der „Für die Lösung hier klicken!“ button verschiebt bei mir nur die Namen eine Zeile runter Lösung wird allerdings auch schon angezeigt weis aber nicht ob das nur bei mir so ist…
    MfG
    Raze

    1. Hallo Raze VorteX, vielen Dank für Deine Kommentare! Das hilft mir wirklich weiter. Die Navigation ist eine Baustelle und dann hat die Seite bewegte Zeiten hinter sich. Ich habe zwei Seiten zusammengeführt und werde sicherlich noch eine ganze Weile an den Nahtstellen arbeiten. Die Idee mit dem Forum finde ich aber spannend. Das hatte ich vor langer Zeit schon mal, musste es aber wegen zu viel Spam wieder deaktivieren. Ich werde aber mal gucken, ob die Technik da weiter ist. Also nochmal vielen Dank für die Hinweise und Vorschläge! Liebe Grüße Stefan

      1. freut mich. spam sollte kein proplem sein gängig wäre da wohl ein reputation system das neuen/unbekannten usern ein limit an nachrichten pro zeit setzt etwa 1 alle 5 min… report systeme und gegebenenfalls mods je nach grösse und bedarf also vom technischem aspekt dürften trolle keine chance bei einer aktiv geführten seite haben. viel erfolg.
        mfg
        RazeVorteX

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Ich akzeptiere

 

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.