Globale Variable = Referenz

Hier ist der ideale Ort um über Scripts und Mods für X³: Terran Conflict und X³: Albion Prelude zu diskutieren.

Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum

User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Globale Variable = Referenz

Post by Reflexer »

Hi Leute,

wie ihr wisst scripte ich jetzt schon seit einigen Jahren für die X-Reihe.

Was mir bisher noch nie aufgefallen ist bzw. was ich gestern durch Zufall bemerkt habe ist, dass die globalen Variablen immer Referenzen sind. Ich glaube nicht, dass das alle wissen.

Für alle, die nur so nebenbei scripten eine kurze Erklärung.

Wenn ihr eine globale Variable lokal verarbeitet, werden Änderungen an der "lokalen" Variablen automatisch in der gV gespeichert.

Hierzu ein kurzes Beispiel:

Ihr erzeugt euch an irgend einer Stelle ein Array und speichert dies in einer gV:

Code: Select all

$Testarray = create new array, arguments='Wert1', 'Wert2', 'Wert3', null, null
set global variable: name='xxx.Test.gV' value=$Testarray
An einer anderen Stelle lest ihr die gV und ändert die Werte des lokalen Arrays:

Code: Select all

$DatagV = get global variable: name='xxx.Test.gV'
* Ändern der lokalen Werte:
insert 'Neuer erster Wert' into array $DatagV at index 0
Ohne nun ein erneutes "set global variable...." machen zu müssen enthält euer Array in der gV nun folgende Werte:

Code: Select all

0=Neuer erster Wert
1=Wert1
2=Wert2
3=Wert3
Wenn ihr also lokal mit Arrays aus einer gV arbeiten wollt, ohne die Daten der gV zu ändern, müsst ihr euch eine Kopie erzeugen.

Ein einfaches

Code: Select all

$WorkerArray = $gVArray
reicht hierzu nicht!

Ihr müsst euch eine Arbeitskopie folgendermaßen erzeugen:

Code: Select all

$tmpRacesgV = get global variable: name='plugin.ship.database.races'
$tmpRacesgVCount = size of array $tmpRacesgV
* Array klonen:
dec $tmpRacesgVCount =
$tmpRacesAll = clone array $tmpRacesgV : index 0 ... $tmpRacesgVCount
* Der Eintrag "alle" wird an Position 0 eingefügt:
insert $TextAll into array $tmpRacesAll at index 0
Das Beispiel habe ich aus den SFDB genommen. Ich denke jeder Scripter versteht was passiert ;)

Ich hoffe, dass diese Erklärung den Leuten was bringt, die das erste Mal über diesen "Fallstrick" stolpern. Wie bereits gesagt - mir viel das erst nach mehreren Jahren auf ;)

Gruß
Reflexer
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

genau genommen sind Arrays referenzen, nicht lokale/globale Variablen ;) man bemerkt dies lediglich wenn man sie als GVs/LVs verwendet, weil sie in anderen fällen nicht scriptübergreifend verwendet werden.. normale Variablen dagegen musst du immer neu in die GV/LV schreiben, wenn sich ihr Wert ändert.

PS und den weg zum kopieren ist zu umständlich.. es gibt einen extra befehl, um Arrays zu klonen (für genau diesen fall) ;)
User avatar
Reflexer
Posts: 863
Joined: Sat, 21. Feb 09, 12:54
x4

Post by Reflexer »

UniTrader wrote:genau genommen sind Arrays referenzen, nicht lokale/globale Variablen ;) man bemerkt dies lediglich wenn man sie als GVs/LVs verwendet, weil sie in anderen fällen nicht scriptübergreifend verwendet werden.. normale Variablen dagegen musst du immer neu in die GV/LV schreiben, wenn sich ihr Wert ändert.
Das war mir klar. Mir ist es nur bei den gVs aufgefallen, dass diese eben "globale Referenzen" sind und ich wollte mal drauf aufmerksam machen, falls sich jemand wundert, warum die gVs bei lokalen Änderungen ohne ein erneutes "set" die geänderten Werte habe. Man kann da nämlich auf die Fresse fallen und ein weilchen suchen, wenn man das nicht weiß ;)
UniTrader wrote:PS und den weg zum kopieren ist zu umständlich.. es gibt einen extra befehl, um Arrays zu klonen (für genau diesen fall) ;)
Wenn Du meinen Code angeschaut hättest, dann hättest Du gesehen, dass ich genau das geschrieben habe ;)

Code: Select all

$tmpRacesAll = clone array $tmpRacesgV : index 0 ... $tmpRacesgVCount
User avatar
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER »

Vielleicht solltest du den Titel ändern, denn "Globale Variable = Referenz" stimmt so nicht. Was stimmt ist "Array = Referenz" und damit auch "Globales Array = Referenz".
Aber trotzdem ein guter Hinweis - wurde mir auch erst nach einiger Zeit klar.

An dieser Stelle macht es wahrscheinlich auch Sinn auf das entsprechende Topic in der foreneigenen MSCI Refernenz hinzuweisen: http://forum.egosoft.com/viewtopic.php?t=288230
Interessant ist hier auch der letzte Punkt mit Text-Referenzen.

Return to “X³: Terran Conflict / Albion Prelude - Scripts und Modding”