10.4 Lokale Variablen

Sie sollten wann immer und wo immer möglich lokale Variablen verwenden. Sie verbessern die Speicherverwaltung des Programms, da der Speicherbereiniger automatisch weiß, wann er sie löschen kann. Darüber hinaus ist der Zugriff auf lokale Variablen viel schneller als auf globale, weil Hollywood nicht den gesamten globalen Code durchsuchen muss und schließlich erhöht es die Lesbarkeit des Programms.

Lokale Variablen haben eine begrenzte Lebensdauer. Sie werden nur in dem Block zur Verfügung stehen, wo man sie deklariert hat. Ein Block wird in der Regel eine Funktion oder Steuerungsstruktur sein. Sie können sogar Blöcke definieren, indem Sie Block und EndBlock verwenden.

Wichtig: Lokale Variablen müssen explizit deklariert werden. Wenn Sie dies nicht tun, wird die Variable automatisch global sein. Zum Beispiel, wenn Sie

 
Function p_Add(a, b)
    tmp = a + b
    Return(tmp)
EndFunction

schreiben, wird tmp automatisch als globale Variable erstellt werden. Aber das ist nur eine Verschwendung von Ressourcen, weil Sie die Variable nur innerhalb der Funktion benötigen. So sollten Sie besser schreiben:

 
Function p_Add(a, b)
    Local tmp = a + b
    Return(tmp)
EndFunction

Nun ist tmp explizit als lokale Variable deklariert und wird gelöscht, wenn die Funktion p_Add() beendet ist.

Wie Sie bereits gesehen haben, werden lokale Variablen mit der Local-Anweisung deklariert. Um eine lokale Variable zu deklarieren, setzten Sie einfach die Anweisung Local vor die Deklaration:

 
a = 10        ; Globale Variable
Local b = 10  ; Lokale Variable

Wenn Sie mehrere Variablen mit einer Local-Anweisung initialisieren wollen, verwenden Sie einfach Kommas, wie Sie es bei einer normalen Zuordnung tun würden:

 
a, b = 10, 5        ; Globale Variablen! a erhält 10, b bekommt 5
Local x, y = 10, 5  ; Lokale Variablen! x bekommt10, y erhält 5

Sobald Sie eine Variable als lokal deklariert haben, müssen Sie die Local-Anweisung auf diese Variable nicht mehr verwenden oder wiederholen:

 
; if x > 10, multipliziere mit 2, sonst dividiere mit 2
If x > 10
    Local tmp = x  ; deklariert die lokale Variable "tmp"
    tmp = tmp * 2  ; multipliziert die lokale variable "tmp" mit 2
    x = tmp        ; Wert der lokalen Variable "tmp" wird "x" zugewiesen
Else
    Local tmp = x  ; deklariert die lokale Variable "tmp"
    tmp = tmp / 2  ; dividiert die lokale Variable "tmp" durch 2
    x = tmp        ; Wert der lokalen Variable "tmp" wird "x" zugewiesen
EndIf

Print(tmp)         ; hier wird 0 ausgegeben, weil "tmp" ist weg

Der obige Code erzeugt die lokale Variable tmp in den beiden Blöcken der If-Anweisung. Danach wird sie multipliziert mit oder dividiert durch 2. Die Anweisung Local ist da nicht mehr erforderlich, da Hollywood bereits an dieser Stelle weiß, dass tmp eine lokale Variable ist. tmp wird am Ende des If-Blocks gelöscht, so dass sie in der Zeile Print(tmp) nicht mehr da ist. tmp wird am Ende des If-Blocks zu Nil.

Wenn Sie einer lokalen Variablen keinen Wert zuweisen, wird es den Wert Nil erhalten, aber Hollywood wird wissen, dass es sich um eine lokale Variable handelt, z.B:

 
If True         ; Block wird immer betreten
    Local x     ; deklarieren der lokalen Variable x
    Print(x)    ; gibt 0 aus, da x Nil ist
    x = 5       ; weist lokalem x 5 zu
    Print(x)    ; gibt jetzt 5 aus
EndIf           ; x wird hier gelöscht

Print(x)        ; gibt 0 aus, weil x wieder Nil ist

Sie können auch den Namen einer globalen Variablen (oder einer lokalen Variable des oberen Blocks) für eine neue lokale Variable verwenden. Zum Beispiel:

 
a = 50            ; deklariert a als global und wiest ihr 50 zu
Block             ; begrenzt die nächsten beiden Zeilen als Block
    Local a = 40  ; deklariert die lokale Variable "a", weist ihr 40 zu
    NPrint(a)     ; gibt 40 aus
EndBlock          ; lokale Variable "a" wird hier gelöscht

NPrint(a)         ; gibt 50 aus

Ein komplexeres Beispiel, die viele Variablen mit dem gleichen Namen verwendet:

 
x = 10                ; global x (x1 = 10)
Block                 ; neuer Block
  Local x = x + 1     ; weist 11 der lokalen Variable x zu (x2 = x1 + 1)
  Block               ; neuer Block
    Local x = x + 1   ; weist 12 der lokalen Variable x zu (x3 = x2 + 1)
    Block             ; neuer Block
      Local x = x + 1 ; weist 13 der lokalen Variable x zu (x4 = x3 + 1)
      NPrint(x)       ; gibt 13 aus (= x4)
    EndBlock          ; der Bereich von x4 endet hier
    NPrint(x)         ; gibt 12 ais (= x3)
  EndBlock            ; der Bereich von x3 endet hier
  NPrint(x)           ; gibt 11 aus (= x2)
EndBlock              ; der Bereich von x2 endet hier
NPrint(x)             ; gibt 10 aus (= x1)

Dieser Code könnte ein wenig verwirrend aussehen, aber er macht Sinn. In jedem neuen Block wird die neue lokale Variable x ausgehend vom aktuellen Rahmen durch die Variable x des vorhergehenden Block mit +1 initialisiert.

Es ist zu beachten, dass Sie lokale Variablen nicht zusammen mit Gosub() verwenden können, weil Hollywood bei einer Gosub()-Anweisung aus dem Block springen wird. Bei der Rückkehr haben die Variablen völlig verschiedene Daten. So arbeitet der folgende Code nicht:

 
;Ungültiger Code
Block
    Local a = 50      ; erstellt lokale Variable "a"
    Gosub(SUBROUTINE) ; Sprung aus dem Block; "a" wird weg geworfen
    Print(a)          ; lokal "a" hat jetzt irgendein zufälliger Wert
EndBlock

Dies sollte kein großes Problem darstellen, da Gosub() ohnehin seit Hollywood 2.0 veraltet ist und in Ihrem Code nicht mehr verwendet werden sollte. Benutzen Sie nun die Anweisung Function.)

Sie können auch lokale Funktionen nutzen. Sie arbeiten fast in der gleichen Weise. Sie sollten lokale den globalen Funktionen vorziehen, obwohl Sie sie höchstwahrscheinlich nicht so übermäßig verwenden werden, wie Sie lokale Variablen gebrauchen. Aber sie können von Zeit zu Zeit sehr nützlich sein. Siehe Lokale Funktionen für Details.


Navigation zeigen