Referenz - Gültigkeitsbereich von Variablen
Eine Variable hat immer nur in dem Umfeld Gültigkeit, in dem sie definiert wird. Solche Gültigkeitsbereiche werden als Scope-Blöcke bezeichnet. Variablen, die im Hauptprogramm deklariert werden, sind in der Regel im gesamten Hauptprogramm gültig oder "sichtbar", nicht jedoch in den Prozeduren (SUBs und FUNCTIONs). Eine Varable, die in einer Prozedur deklariert wurde, ist dagegen nur in dieser Prozedur sichtbar. Die genaueren Regeln, welche Variablen wo sichtbar sind, werden im Folgenden aufgeführt.
In FreeBASIC gibt es vier Kategorien von Scope-Blöcken: LOCAL, SHARED, COMMON und COMMON SHARED. Jeder dieser Blöcke hat seine eigenen Sichtbarkeitsregeln. Außerdem existiert die Anweisung EXTERN, die eine ähnliche Bedeutung wie COMMON SHARED besitzt.
LOCAL
Variablen, die in einem lokalen Scope deklariert wurden, sind auch nur in diesem sichtbar.
- SUB, FUNCTION, das Hauptprogramm und jeder Befehlsblock (SCOPE...END SCOPE, FOR...NEXT, DO...LOOP, IF...END IF usw.) bildet einen eigenen Scope-Block.
- Explizit mit DIM oder REDIM definierte Variablen gelten im Scope-Block, in dem sie deklariert wurden.
- Wenn in einem Scope-Block eine Variable verwendet wird, die in diesem Block nicht explizit deklariert wurde, dann wird die Variable des umgebenden Scope-Blocks verwendet.
Beispiele:
DIM AS INTEGER a = 0, b = 0
DO
a += 1 ' Zugriff auf die Variable des Hauptmodus
DIM AS INTEGER b = a^2 ' Dieses b ist nur in der Schleife bekannt
PRINT "In der Schleife: ";
PRINT "a =";a, " b ="; b
LOOP UNTIL a = 10
PRINT "Ausserhalb: ";
PRINT "a =";a; " b ="; b
SLEEP
SUB fehlerhafterAufruf
DIM AS INTEGER c
PRINT a ' erzeugt einen Fehler
END SUB
In der DO-Schleife wird die Variable a aus dem Hauptmodul verwendet. Deswegen sind Änderungen innerhalb der Schleife anschließend auch im Hauptmodul bekannt. Die Änderungen der Variablen b betreffen jedoch nur die Schleife und haben anschließend keine Auswirkung mehr.
Die in der SUB verwendete Variable ist dort nicht bekannt, weshalb es zu einem Compiler-Fehler kommt. Dasselbe würde passieren, wenn man versuchen würde, die in der SUB deklarierte Variable c im Hauptprogramm aufzurufen.
In der FOR-Schleife kann die Zählvariable direkt als lokale Variable des FOR-Blocks deklariert werden. Sie ist dann außerhalb der Schleife nicht mehr gültig. Ermöglicht wird dies durch die Syntax FOR variable AS datentyp = start TO ende
DIM AS STRING s = "Hallo Welt!"
FOR s AS INTEGER = 1 to 3
PRINT s
NEXT
PRINT s
Achtung: Während im oben stehenden Beispiel die Variable im Schleifenkopf deklariert wurde und daher auch im Schleifenfuß abgefragt werden kann, ist eine im Schleifenrumpf deklarierte Variable im Kopf und Fuß der Schleife nicht bekannt und kann dort nicht als Abbruchbedingung genutzt werden. Es ist in diesem Fall nur möglich, die Schleife über EXIT zu verlassen.
' funktioniert nicht:
' DO
' DIM AS STRING taste = INKEY ' Deklaration im Rumpf
' SLEEP 1
' LOOP UNTIL LEN(taste) ' taste ist hier nicht bekannt
' Alternative
DO
DIM AS STRING taste = INKEY
SLEEP 1
IF LEN(taste) THEN EXIT DO
LOOP
SHARED
Globale Variablen, die mit dem Befehl DIM SHARED deklariert wurden, sind im ganzen Modul einschließlich seiner SUBs und FUNCTIONs sichtbar. Das Modul teilt also die Variable mit seinen Prozeduren.
DIM SHARED darf nur auf Modulebene verwendet werden, nicht jedoch in einer SUB, einer FUNCTION oder einem Befehlsblock (wie DO...LOOP). Eine mit DIM SHARED deklarierte globale Variable kann jedoch wieder lokal "überschrieben" werden. Wenn nach einer solchen lokalen Überschreibung wieder auf die globale Variable zugegriffen werden soll, ist das durch zwei Punkte vor dem Variablennamen möglich.
Beispiel:
DECLARE SUB test
DIM SHARED AS INTEGER variable = 1
PRINT "vor der SUB: "; variable ' globale Variable
test
PRINT "nach der SUB: "; variable ' globale Variable, geändert
SLEEP
SUB test
variable += 1 ' globale Variable ändern
PRINT "in der SUB (1):"; variable ' noch die globale Variable
DIM AS STRING variable = "neu"
PRINT "in der SUB (2):"; variable ' jetzt eine lokale Variable
PRINT "nochmal global:"; ..variable ' globale Variable
END SUB
COMMON
COMMON kann zum Einsatz kommen, wenn ein Programm aus mehreren Modulen zusammengesetzt ist, d. h. wenn es aus mehreren einzelnen .bas-Dateien besteht, die zusammen compiliert werden. Wird eine Variable mit der Anweisung COMMON deklariert, dann steht sie nicht nur in diesem Modul zur Verfügung, sondern auch in allen anderen Modulen, welche die Variable ebenfalls mit COMMON deklarieren.
Für folgendes Beispiel müssen Sie beide Code-Teile unter dem jeweils angegebenen Namen speichern. Compilieren Sie anschließend mit
fbc modul1.bas modul2.bas
modul1.bas
COMMON m1 AS INTEGER
COMMON m2 AS INTEGER
' Dies wird nach allen anderen Modulen ausgeführt
m1 = 1
PRINT "Modul 1"
PRINT "m1 = "; m1 ' m1 = 1, wie in diesem Modul gesetzt
PRINT "m2 = "; m2 ' m2 = 2, wie im Modul 2 gesetzt
SLEEP
module2.bas
COMMON m1 AS INTEGER
COMMON m2 AS INTEGER
m2 = 2
' Dies wird zuerst ausgeführt
PRINT "Modul 2"
PRINT "m1 = "; m1 ' m1 = 0 (Standardbelegung)
PRINT "m2 = "; m2 ' m2 = 2
SUB unterprogramm
' m1 und m2 sind hier nicht sichtbar. Ein Befehl wie
' PRINT "m1 = "; m1
' würde zu einem Compilier-Fehler führen.
END SUB
Ausgabe:
Modul 2
m1 = 0
m2 = 2
Modul 1
m1 = 1
m2 = 2
COMMON SHARED
Wie unter COMMON steht die mit COMMON SHARED deklarierte Variable in allen Modulen zur Verfügung. Innerhalb eines Moduls sorgt das Schlüsselwort SHARED außerdem dafür, dass die Variable in allen SUBs und FUNCTIONs des betreffenden Moduls sichtbar ist.
Für folgendes Beispiel müssen Sie beide Code-Teile unter dem jeweils angegebenen Namen speichern. Compilieren Sie anschließend mit
fbc modul3.bas modul4.bas
modul3.bas
DECLARE SUB unterprogramm
COMMON m1 AS INTEGER
COMMON m2 AS INTEGER
' Dies wird nach allen anderen Modulen ausgeführt
m1 = 1
PRINT "Modul 3"
PRINT "m1 = "; m1 ' m1 = 1, wie in diesem Modul gesetzt
PRINT "m2 = "; m2 ' m2 = 2, wie im Modul 4 gesetzt
unterprogramm
SLEEP
module4.bas
COMMON SHARED m1 AS INTEGER
COMMON SHARED m2 AS INTEGER
m2 = 2
' Dies wird zuerst ausgeführt
PRINT "Modul 4"
PRINT "m1 = "; m1 ' m1 = 0 (Standardbelegung)
PRINT "m2 = "; m2 ' m2 = 2
SUB unterprogramm
PRINT "Modul4.unterprogramm"
PRINT "m1 = "; m1 ' m1 = 1
PRINT "m2 = "; m2 ' m2 = 2
END SUB
Ausgabe:
Modul 4
m1 = 0
m2 = 2
Modul 3
m1 = 1
m2 = 2
Modul4.unterprogramm
m1 = 1
m2 = 2
EXTERN
Der Vollständigkeit halber sei die Möglichkeit erwähnt, EXTERN zu verwenden. Die Funktionsweise entspricht in etwa der von COMMON SHARED. Die Variable wird also in einem Modul deklariert und in einem anderem verwenden. Dabei ist die Variable im Modul automatisch global, auch ohne SHARED.
Doch während COMMON SHARED in jedem Modul eigenen Speicher für die Variable reserviert, zeigt EXTERN immer nur auf den Speicherbereich des Moduls, in dem die Variable auch normal deklariert wurde.
Für folgendes Beispiel müssen Sie beide Code-Teile unter dem jeweils angegebenen Namen speichern. Compilieren Sie anschließend mit
fbc modul5.bas modul6.bas
modul5.bas
Declare Sub unterprogramm
Extern m1 As Integer
Extern m2 As Integer
Dim m1 As Integer
Dim m2 As Integer
' Dies wird nach allen anderen Modulen ausgeführt
m1 = 1
Print "Modul 5"
Print "m1 = "; m1 ' m1 = 1, wie in diesem Modul gesetzt
Print "m2 = "; m2 ' m2 = 2, wie im Modul 6 gesetzt
unterprogramm
Sleep
module6.bas
Extern m1 As Integer
Extern m2 As Integer
m2 = 2
' Dies wird zuerst ausgeführt
Print "Modul 6"
Print "m1 = "; m1 ' m1 = 0 (Standardbelegung)
Print "m2 = "; m2 ' m2 = 2
Sub unterprogramm
Print "Modul6.unterprogramm"
Print "m1 = "; m1 ' m1 = 1
Print "m2 = "; m2 ' m2 = 2
End Sub
Ausgabe:
Modul 6
m1 = 0
m2 = 2
Modul 5
m1 = 1
m2 = 2
Modul6.unterprogramm
m1 = 1
m2 = 2
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|