Navigation überspringen

Lokale Variablen

Bislang kennst du ausschließlich globale Variablen. Diese werden zu Beginn des Programms deklariert und können dann überall verwendet werden, z.B. in den Funktionen setup()  und draw():

int x; // neue globale Variable

// Anfangsposition festlegen
void setup() {
   x = 0;
}

// Ball animieren
void draw() {
   background(255);
   ellipse(x, 50, 20, 20);
   x = x + 1;
}

Variable x nennt man eine globale Variable, weil sie überall im Programm verwendet werden kann. Hier wird x in zwei verschiedenen Funktionen (setup und draw) verwendet.

Scope

Manchmal möchte man gar nicht, dass eine Variable überall verwendbar ist. Wie sich bei größeren Programmen herausstellt, wird der Code durch viele globale Variablen unübersichtlich. Daher gibt es lokale Variablen, die nur eine eingeschränkte Lebensdauer haben, d.h. sie sind nur in einem bestimmten Bereich gültig. Den Bereich, innerhalb dessen eine Variable gültig ist, nennt man den Scope der Variable.

Nehmen wir an, du möchtest einen Ball animieren. Der Durchmesser des Balls soll wachsen, also nehmen wir einfach den x-Wert auch als Durchmesser. Wir möchten aber, dass der Durchmesser nicht bei 0, sondern bei 10 beginnt. Also nehmen wir x + 10 als Durchmesser:

float x = 0;

void draw() {
    ellipse(x, 50, x + 10, x + 10);
    x = x + 1;
}

Der Übersichtlichkeit willen möchten wir eine Variable für den Durchmesser einführen. Diese wird aber lediglich in draw() benötigt (nicht z.B. in setup). Daher definieren wir eine lokale Variable:

float x = 0;

void draw() {
    float durchmesser = x + 10; // Neue lokale Variable
    ellipse(x, 50, durchmesser, durchmesser);
    x = x + 1;
}

Eine lokale Variable ist nur im eigenen Code-Block gültig, angefangen von der Zeile, wo die Variable deklariert wird bis zur schließenden geschweiften Klammer des aktuellen Code-Blocks. Im oberen Beispiel hört die lokale Variable durchmesser auf zu leben, sobald draw abgearbeitet ist.

Der Scope - also der Gültigkeitsbereich - einer lokalen Variable beginnt in der Zeile, in der sie deklariert wird und endet am Ende des eigenen Code-Blocks.
Willst du z.B. im folgenden Code auf die Variable durchmesser in der Funktion setup() zugreifen, dann bekommest du einen Fehler:

float x = 0;

void setup() {
    durchmesser = 10; // FEHLER! VARIABLE UNBEKANNT
}

void draw() {
    float durchmesser = x + 10; // Neue lokale Variable
    ellipse(x, 50, durchmesser, durchmesser);
    x = x + 1;
}


Überschatten

Wichtig ist, dass nur das Wörtchen float (oder int oder boolean ...) darüber entscheidet, ob du eine neue Variable anlegst oder eine alte Variable setzt. Wie in folgendem Beispiel, wo du den x-Startpunkt des Balls zufällig setzen möchtest:

float x = 0; // Globales x

void setup() {
    float x = random(100); // Startpunkt für x zufällig
}

void draw() {
    background(255);
    ellipse(x, 50, 20, 20);
    x = x + 1;
}

Dein Ball startet immer bei Null! Warum? Weil in setup() eine neue Variable mit Namen x erzeugt wird. Diese neue Variable ist lokal in setup() und hat nichts mit dem globalen x zu tun. Das heißt, das globale x wird nicht verändert, bleibt also Null, und in draw() wird natürlich das globale x verwendet.

Im obigen Beispiel sagt man auch, dass die lokale Variable x die globale Variable überschattet. Um das zu vermeiden, verwende nie den gleichen Variablennamen zweimal und achte darauf, dass du nicht aus Versehen einen Typ wie "float" vor eine Variable setzt, obwohl du nur eine Zuweisung durchführen willst.

Zusammenfassung

  • Im Gegesatz zu einer globalen Variable, welche im gesamten Programm verwendet werden kann, sind lokale Variablen nur in einem bestimmen Bereich verwendbar.
    • Variablen, die innerhalb einer Funktion deklariert werden (wie z.B. draw  oder setup) können nur innerhalb dieser Funktion verwendet werden und sind somit lokal.
  • Der Bereich, in dem eine Variable verwendet werden kann heißt Scope
    • Der Scope einer Variable beginnt mit der Zeile, in der sie deklariert wird und endet mit der geschlossenen geschweiften Klammer des jeweiligen Code-Blocks.

Made with eXeLearning (New Window)