Referenz - SHARED
Syntax A: { DIM | REDIM | COMMON | STATIC } SHARED Variable AS Typ [, Variable AS Typ ...]
Syntax B: { DIM | REDIM | COMMON | STATIC } SHARED AS Typ Variablenliste
Typ: Schlüsselwort
Kategorie: Deklaration
SHARED wird zusammen mit DIM / REDIM, COMMON und STATIC eingesetzt und bewirkt, dass Variablen sowohl auf Modulebene als auch innerhalb von Prozeduren (SUBs und FUNCTIONs) verfügbar sind.
DIM SHARED und STATIC SHARED bewirken dabei nur Zugriffsrechte für Prozeduren innerhalb desselben Moduls, während auf die Variablen, die mit COMMON SHARED deklariert werden, von jeder Prozedur und von jedem Modul aus zugegriffen werden kann.
DIM und STATIC sind in Verbindung mit SHARED gleichbedeutend, was auf die Eigenschaften von STATIC zurückzuführen ist. STATIC SHARED ist faktisch nur aus Kompatibilitätsgründen zu QuickBASIC vorhanden.
Beispiel:
DECLARE SUB MySub ()
DIM SHARED x AS INTEGER
DIM y AS INTEGER
x = 10
y = 5
PRINT "x ist:";x
PRINT "y ist:";y
PRINT
MySub
SLEEP
SUB MySub
PRINT "x ist: "; x
PRINT "y ist: "; y ' fehlerhafter Aufruf
END SUB
Dieser Code erzeugt beim Compilieren mit der Option -lang fb (Standard) einen Fehler, weil 'y' in der SUB MySub nicht deklariert wurde.
In der Sub MySub kann durchaus mit einer Variable mit dem Namen 'y' gearbeitet werden:
DECLARE SUB MySub ()
DIM SHARED x AS INTEGER
DIM y AS INTEGER
x = 10
y = 5
PRINT "x ist:"; x
PRINT "y ist:"; y
PRINT
MySub
PRINT
PRINT "x ist:"; x
PRINT "y ist:"; y
SLEEP
SUB MySub
DIM y AS INTEGER = 15
PRINT "Innerhalb der Prozedur:"
PRINT "x ist:"; x
PRINT "y ist:"; y
x = 3
END SUB
Ausgabe:
x ist: 10
y ist: 5
Innerhalb der Prozedur:
x ist: 10
y ist: 15
x ist: 3
y ist: 5
Durch SHARED wird eine Variable von einer lokalen zu einer globalen Variable. Das bedeutet, dass sie von jedem beliebigen Punkt im Programm, also von jedem Unterprogramm aus, gelesen und auch geändert werden kann.
Eine lokale Variable hingegen ist immer nur in der aktuellen Prozedur verfügbar. Die Variable mit der Bezeichnung 'y' in MySub ist von der Variable mit der Bezeichnung 'y' im Hauptmodul vollkommen unabhängig.
Um eine lokale Variable einer Prozedur zugänglich zu machen, muss sie in der Parameterliste der Prozedur erwähnt werden; siehe dazu Prozeduren (Parameterübergabe), SUBs, FUNCTIONs.
Hinweis zur expliziten Variableninitialisierung:
Da SHARED-Variablen zur Compilezeit umgesetzt werden, können direkt bei der Deklaration nur Konstanten zur expliziten Initialisierung zugewiesen werden.
Dim Shared As Integer variable = 20
Da Integer-Literale (Zahlen) immer zu Konstanten umgesetzt werden, ist die oben stehende Deklaration mit expliziter Initialisierung möglich, wohingegen Folgendes nicht compiliert (Compilezeit-Fehler):
Dim As Integer x = 20
Dim Shared As Integer variable = x
Stattdessen müssen Deklaration und Wertzuweisung der Integer-Variablen variable aufgeteilt werden, sodass variable zunächst in der zweiten Zeile implizit mit 0 (Konstante) initialisiert wird:
Dim As Integer x = 20
Dim Shared As Integer variable
variable = 20 + x
String-Variablen, die SHARED deklariert wurden, können nie initialisiert werden, auch nicht mit konstanten Strings. Dies ist auf die interne Struktur eines variablen Strings in FreeBASIC zurückzuführen.
Hinweis zu Constructoren von Objekten:
Wird eine Variable eines UDTs erzeugt und mit SHARED global zugänglich gemacht, wird das Objekt noch vor Programmbeginn initiiert. Dies hat gerade dann Bedeutung, wenn der CONSTRUCTOR des Objekts bestimmte Arbeiten übernehmen soll. Die exakte Reihenfolge kann anhand des folgenden Beispiels gesehen werden:
Type foo
bar As Integer
Declare Constructor ()
End Type
Constructor foo ()
Print "Ctor"
End Constructor
Sub Start1 Constructor 101
Print "Start1"
End Sub
Sub Start2 Constructor
Print "Start2"
End Sub
Print "Hauptprogramm startet"
Print "Deklariere Variable"
Dim Shared As foo bar
Print "Hauptprogramm beendet"
Sleep
Ausgabe:
Start1
Ctor
Start2
Hauptprogramm startet
Deklariere Variable
Hauptprogramm beendet
Soll die Initialisierung dagegen nicht zu Programmbeginn, sondern an einer bestimmten (späteren) Stelle im Programmablauf erfolgen, so kann dies durch die Verwendung von Pointern erzwungen werden. Der Grund hierfür ist, dass Pointervariablen erst initialisiert werden, wenn mit NEW ein Objekt erstellt wird.
Unterschiede zu QB:
- SHARED ist unter FreeBASIC nur noch ein Schlüsselwort, kein eigener Befehl; es funktioniert nur im Zusammenhang mit DIM, REDIM oder COMMON.
- Die alternative Syntax DIM SHARED AS Typ Variablenliste (Syntax B) ist neu in FreeBASIC.
Siehe auch:
DIM, REDIM, COMMON, Datentypen und Deklarationen
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|