LOCAL Variable: Unterschied zwischen den Versionen

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen
 
Zeile 13: Zeile 13:
== Unterschiede zu dynamisch deklarierten Variablen ==
== Unterschiede zu dynamisch deklarierten Variablen ==


Im Unterschied zu den dynamischen Variablen existiert der Variablenname zur Laufzeit nicht mehr, sondern die Variable (bzw. der Inhalt) werden durch einen Pointer abgebildet.
Im Unterschied zu den [[dynamischen Variablen]] existiert der Variablenname zur Laufzeit nicht mehr, sondern die Variable (bzw. der Inhalt) werden durch einen Pointer abgebildet.


  LOCAL bBlock, nI
  LOCAL bBlock, nI
Zeile 20: Zeile 20:
  ? Eval(bBlock)
  ? Eval(bBlock)


Dieser kleine Codeausschnitt zeigt "10" im Fenster an. Beim Ausführen des Codeblocks in bBlock wird der Wert der Variablen nI zurückgeliefert. Bei der Ausführung wird auf die Speicheradresse von nI direkt zugegriffen. Der Codeblock wird in diesem Beispiel direkt vom Compiler erzeugt.
Dieser kleine Codeausschnitt zeigt "10" im Fenster an. Beim Ausführen des [[Codeblocks]] in bBlock wird der Wert der [[Variablen]] nI zurückgeliefert. Bei der Ausführung wird auf die Speicheradresse von nI direkt zugegriffen. Der [[Codeblock]] wird in diesem Beispiel direkt vom [[Xpp|Compiler]] erzeugt.


Alternativ konnte man früher (!) auch das machen:
Alternativ konnte man früher (!) auch das machen:
Zeile 30: Zeile 30:
  ? Eval(bBlock)
  ? Eval(bBlock)


Hier wird der Codeblock in zwei Schritten erzeugt, indem zuerst bBlock zuerst ein Literal zugewiesen wird, und danach wird der Inhalt (!) von bBlock compiliert. Bei der Ausführung wird in der Variablentabelle die Variable nI gesucht und ihr Inhalt ausgegeben.
Hier wird der [[Codeblock]] in zwei Schritten erzeugt, indem zuerst bBlock zuerst ein Literal zugewiesen wird, und danach wird der Inhalt (!) von bBlock compiliert. Bei der Ausführung wird in der Variablentabelle die Variable nI gesucht und ihr Inhalt ausgegeben.


Was passiert in diesem Fall:
Was passiert in diesem Fall:
Zeile 40: Zeile 40:
  ? Eval(bBlock)
  ? Eval(bBlock)


Alle Anweisungen bis hin zur Zuweisung von 10 an die Variable nI werden ausgeführt. Beim Eval() jedoch erscheint eine Fehlermeldung:
Alle Anweisungen bis hin zur Zuweisung von 10 an die Variable nI werden ausgeführt. Beim [[Eval()]] jedoch erscheint eine Fehlermeldung:


  Error BASE/2000
  Error BASE/2000
Zeile 47: Zeile 47:
  ...
  ...


Beim Compileren des Codeblocks besteht keine Verbindung mehr zwischen dem Variablen-Namen nI und der Speicheradresse, an welcher der Inhalt von nI abgelegt ist. Die Laufzeitumgebung vermutet, dass nI eine dynamische Variable sein könnte und erzeugt den Codeblock entsprechend.
Beim Compileren des [[Codeblocks]] besteht keine Verbindung mehr zwischen dem Variablen-Namen nI und der Speicheradresse, an welcher der Inhalt von nI abgelegt ist. Die Laufzeitumgebung vermutet, dass nI eine [[dynamische Variable]] sein könnte und erzeugt den [[Codeblock]] entsprechend.


Wenn der Codeblock ausgeführt werden soll, wird in der Variablentabelle nachgesehen, ob es eine dynamische Variable mit dem Namen nI gibt. Da dies nicht der Fall ist, gibt es eine Fehlermeldung.
Wenn der [[Codeblock]] ausgeführt werden soll, wird in der Variablentabelle nachgesehen, ob es eine [[dynamische Variable]] mit dem Namen nI gibt. Da dies nicht der Fall ist, gibt es eine Fehlermeldung.


== Sichtbarkeit von LOCAL Variablen ==
== Sichtbarkeit von LOCAL Variablen ==


Genaueres findet sich hier: [[Lebenszeit und Sichtbarkeit der Variablen-Klassen]]
Genaueres findet sich hier: [[Lebenszeit und Sichtbarkeit der Variablen-Klassen]]

Aktuelle Version vom 17. Juni 2013, 16:33 Uhr

Definition einer LOCAL Variablen

LOCAL Variable gehören zu den lexikalischen Variablen, die durch den [Xpp|Compiler]] aufgrund einer expliziten Definition (LOCAL Statement), oder implizit als Parameter einer Funktion deklariert werden.

FUNCTION TueIrgendEtwas(cParam1, nParam2)
  LOCAL nI, nLen

Werden Parameter in den auf den Namen der Funktion folgenden Klammern definiert, werden sie als LOCAL Variable angelegt. cParam1 und nParam2 sind also implizit definierte LOCAL Variablen, während nI und nLen explizit über die Anweisung LOCAL deklariert wurden.

Zur Reihenfolge der Deklaration siehe ausführbare und nicht ausführbare Deklarationen.

Unterschiede zu dynamisch deklarierten Variablen

Im Unterschied zu den dynamischen Variablen existiert der Variablenname zur Laufzeit nicht mehr, sondern die Variable (bzw. der Inhalt) werden durch einen Pointer abgebildet.

LOCAL bBlock, nI
bBlock := {|| nI}
nI := 10
? Eval(bBlock)

Dieser kleine Codeausschnitt zeigt "10" im Fenster an. Beim Ausführen des Codeblocks in bBlock wird der Wert der Variablen nI zurückgeliefert. Bei der Ausführung wird auf die Speicheradresse von nI direkt zugegriffen. Der Codeblock wird in diesem Beispiel direkt vom Compiler erzeugt.

Alternativ konnte man früher (!) auch das machen:

PRIVATE bBlock, nI
bBlock := "{|| nI}"
bBlock := &bBlock
nI := 10
? Eval(bBlock)

Hier wird der Codeblock in zwei Schritten erzeugt, indem zuerst bBlock zuerst ein Literal zugewiesen wird, und danach wird der Inhalt (!) von bBlock compiliert. Bei der Ausführung wird in der Variablentabelle die Variable nI gesucht und ihr Inhalt ausgegeben.

Was passiert in diesem Fall:

LOCAL bBlock, nI
bBlock := "{|| nI}"
bBlock := &bBlock
nI := 10
? Eval(bBlock)

Alle Anweisungen bis hin zur Zuweisung von 10 an die Variable nI werden ausgeführt. Beim Eval() jedoch erscheint eine Fehlermeldung:

Error BASE/2000
Description: Unknown Variable
Operation: NI
...

Beim Compileren des Codeblocks besteht keine Verbindung mehr zwischen dem Variablen-Namen nI und der Speicheradresse, an welcher der Inhalt von nI abgelegt ist. Die Laufzeitumgebung vermutet, dass nI eine dynamische Variable sein könnte und erzeugt den Codeblock entsprechend.

Wenn der Codeblock ausgeführt werden soll, wird in der Variablentabelle nachgesehen, ob es eine dynamische Variable mit dem Namen nI gibt. Da dies nicht der Fall ist, gibt es eine Fehlermeldung.

Sichtbarkeit von LOCAL Variablen

Genaueres findet sich hier: Lebenszeit und Sichtbarkeit der Variablen-Klassen