Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - Gültigkeitsbereich von Variablen

Referenz-Navigation

 

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 (BefehlsreferenzeintragSUBs und BefehlsreferenzeintragFUNCTIONs). 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.

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 BefehlsreferenzeintragEXIT 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 BefehlsreferenzeintragDIM 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.

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
END SUB

COMMON

BefehlsreferenzeintragCOMMON 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 BefehlsreferenzeintragCOMMON 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, BefehlsreferenzeintragEXTERN 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 BefehlsreferenzeintragSHARED.

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
  • Der Referenzeintrag wurde am 21.04.2011 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 30.12.2012 von Redakteurnemored gespeichert.
  Versionen Versionen