Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [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 - SHARED

Referenz-Navigation

 

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 BefehlsreferenzeintragDIM / BefehlsreferenzeintragREDIM, BefehlsreferenzeintragCOMMON und BefehlsreferenzeintragSTATIC 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.
BefehlsreferenzeintragDIM und BefehlsreferenzeintragSTATIC 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 BefehlsreferenzeintragProzeduren (Parameterübergabe), BefehlsreferenzeintragSUBs, BefehlsreferenzeintragFUNCTIONs.

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 BefehlsreferenzeintragUDTs erzeugt und mit SHARED global zugänglich gemacht, wird das Objekt noch vor Programmbeginn initiiert. Dies hat gerade dann Bedeutung, wenn der BefehlsreferenzeintragCONSTRUCTOR 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 BefehlsreferenzeintragPointern erzwungen werden. Der Grund hierfür ist, dass Pointervariablen erst initialisiert werden, wenn mit BefehlsreferenzeintragNEW ein Objekt erstellt wird.

Unterschiede zu QB:

Siehe auch:
BefehlsreferenzeintragDIM, BefehlsreferenzeintragREDIM, BefehlsreferenzeintragCOMMON, BefehlsreferenzeintragDatentypen und Deklarationen


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 02.08.2007 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 20.12.2013 von RedakteurMOD gespeichert.
  Versionen Versionen