[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
======Globale und lokale Variablen======
[[http://www.siedler-portal.de/vb3/member.php?userid=1274|Chromix]]
\\
\\
In diesem Abschnitt werden globale und lokale Variablen erklärt. Wie der Name schon andeutet, sind die einen überall verfügbar, während andere nur in einem bestimmten Bereich Gültigkeit besitzen.
Dieses Tutorial ist optional zu lesen, denn jede Variable ist automatisch global, es sei denn man gibt es anders an. Darum braucht man sich aber keine Gedanken zu machen.
Wozu sind dann lokale Variablen gut?
Nun, es kommt öfters vor, daß diverse Werte in einer Variable nur in einem bestimmten Abschnitt gebraucht werden, danach wird dieser nie mehr verwendet. Man könnte sie also "wegwerfen" wenn man wollte. Genau das passiert mit lokalen Variablen auch.
Globale Variablen bleiben "für die Ewigkeit", zumindest so lange wie die Karte läuft, bestehen.
Wenn man nun immer globale Variablen verwendet, könnte man (weil man mal einen gleichlautenden Namen verwendet) den Inhalt einer bestehenden globalen Variable überschreiben, obwohl man ihn eigentlich noch braucht.
Oder man verwendet durch einen Tippfehler ausversehen einen Wert der noch in einer anderen globalen Variable vorhanden ist.
Dadurch können sehr merkwürdige und schwer zu findende Fehler entstehen.
Lokale Variablen gelten immer nur innerhalb eines Blocks. Blöcke wurden schon in einem vorhergehenden Tutorial erklärt.
Wenn man eine lokale Variable benutzt, deren Name identisch zu dem einer globalen Variable ist, so überschreibt eine Zuweisung nicht den Inhalt der globalen Variable (deren Inhalt man später noch braucht), es werden also Fehler vermieden.
Beispiel:
function MachWas( Var1 )
print( Var1 );
end
function f1()
Var1 = "In Funktion 1 gesetzt";
MachWas( "f1:" .. Var1 );
end
function f2()
Var1 = "Das hier kommt von Funktion 2";
MachWas( "f2:" .. Var1 );
end
function f3()
MachWas( "f3:" .. Var1 );
end
Zunächst wird eine Funktion zur Ausgabe deklariert, und zwei Funktionen die einer Variable einen Wert zuweisen, und diese zusammen mit dem eigenen Namen ausgeben. Die dritte Funktion gibt nur den aktuellen Wert der globalen Variable zusammen mit dem eigenen Namen aus.
Ruft man die Funktionen nun in dieser Reihenfolge auf:
f2();
f1();
f3();
Erhält man die Ausgabe:
f2:Das hier kommt von Funktion 2
f1:In Funktion 1 gesetzt
f3:In Funktion 1 gesetzt
Ändert man nun die Aufrufreihenfolge in...
f1();
f2();
f3();
...sieht man, daß f3 nun einen anderen Wert ausgibt. Das ist vielleicht gar nicht gewollt?
f1:In Funktion 1 gesetzt
f2:Das hier kommt von Funktion 2
f3:Das hier kommt von Funktion 2
Der Effekt entsteht dadurch, daß mit globalen Variablen gearbeitet wird. Die Funktionen können sich also gegenseitig beeinflussen.
Wenn man nun in f2 eine lokale Variable deklariert, bleibt das Ergebnis wie im ersten Beispiel mit der Reihenfolge "2, 1, 3", obwohl hier auch "1, 2, 3" verwendet wird.
function f2()
local Var1 = "Das hier kommt von Funktion 2";
MachWas( "f2:" .. Var1 );
end
f1:In Funktion 1 gesetzt
f2:Das hier kommt von Funktion 2
f3:In Funktion 1 gesetzt
Der von f1 gesetzte Wert wird also beim Aufruf von f2 nicht überschrieben.
Eine lokale Variable gilt immer nur bis zum ''end'' des [[Blöcke/Einrückung|Blockes]] in dem sie mit ''local'' deklariert wurde. Das muss nicht unbedingt das nächste end sein, da ja auch verschachtelte Blöcke verwendet werden können.
Wenn man eine Variable später nichtmehr benötigt, sollte man sie also als local deklarieren.
Hier ein Beispiel, welches so nicht funktioniert:
if Regen() then
local WasMachIchNur = "Wäsche reinholen";
end
print( WasMachIchNur );
In der print Zeile wird nicht "Wäsche reinholen" ausgegeben. Die Variable "WasMachIchNur" wurde lokal deklariert. Ihr Block (Gültigkeitsbereich) endet aber schon eine Zeile später. Somit ist sie eine weitere Zeile später für das print() nichtmehr verfügbar.
Umgehen kann man dies, indem man sie ausserhalb des Blocks (also im umgebenden Block) lokal deklariert:
local WasMachIchNur;
if Regen() then
WasMachIchNur = "Wäsche reinholen";
end
print( WasMachIchNur );
Nun wird korrekt "Wäsche reinholen" ausgegeben.
Wie man hier sieht, beendet das "end" nicht den Wirkungsbereich der Variable, da das "end" zum "if" gehört, die Variable aber ausserhalb dieses Blocks deklariert wurde.
Weiterhin braucht man nur bei der ersten Verwendung der Variable in einem Block, also der Deklaration das "local" davorschreiben.
Denn würde man es so machen:
local WasMachIchNur;
if Regen() then
local WasMachIchNur = "Wäsche reinholen";
end
print( WasMachIchNur );
..würde es nicht funktionieren. Denn dann hat man die lokale Variable "WasMachIchNur" im übergeordneten Block, und eine weitere lokale "WasMachIchNur" Variable im "if" "end" Block. Nur der "inneren" wird der Wert zugewiesen. Daher steht, nach dem Ende des Gültigkeitsbereichs der inneren Variable, kein Wert in der äusseren zum ausgeben.
\\
\\
[[:tutorials:index|Zur Tutorial-Übersicht]]