Benehmen sich Arrays wie lokale Variablen?

Hier ist der ideale Ort um über Scripts und Mods für X²: Die Bedrohung zu diskutieren.

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

User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Benehmen sich Arrays wie lokale Variablen?

Post by Lucike »

Was habe ich gestern gesucht, um den Grund für das Ändern der Arrays im Hauptscript zu finden. Dabei habe ich folgendes beobachtet.

Dabei wollte ich das AD Script gestern in neuer Beta veröffentlichen und dann sowas.

Hauptscript main.script

$Test[0] = 1000
@ = [THIS] call script sub.scipt: Test = $Test
write to player logbook $Test

Im Logbuch -> $Test = array{2000}

Unterscript sub.script

$temp = $Test[0]
$temp = $temp + 1000
$Test[0] = $temp
return null

Warum wird die Änderung im Unterscript auch im Hauptscript übernommen. Benehmen sich Arrays etwa wie lokale Variablen? Wäre dumm. :|

Gruß
Lucike
Last edited by Lucike on Fri, 1. Oct 04, 08:10, edited 1 time in total.
Image
merlinschmidt
Posts: 473
Joined: Tue, 24. Feb 04, 08:17
x4

Post by merlinschmidt »

Ich kenne da was aus z.B. C++ (ok da muss man es explizit machen): Bei Arrays und Listen ist es wegen Speicherplatz/Rechenzeitaufwändig sinnvoller diese bei Prozeduraufrufen nicht (ein Array mit 1000 Einträgen, die an sich auch Groß sein können doppelt im Speicher zu haben ist "unwirtschaftlich) zu kopieren. Daher werden bei Arrays/anderen Objekten nicht die Daten kopiert, sondern ein "Speicherzeiger" übergeben. Ich habe noch nie drauf geachtet (oder irgendetwas gescriptet dass sowas provoziert), aber ich könnte mir vorstellen das mit anderen größerern Variablen ähliches passiert (versuch mal ein Var/Ship zu übergeben und das in der unterroutiene zu ändern, ob das dann auch im Hauptprogramm geändert ist).

Ich werde gleich mal ausprobieren ob das mit den Arrays bei mir auch passiert.

[btw: warum musst du auch im Unterprogramm dem Array wieder einen Wer zuweisen? Kannst du da nicht zur Not den Array eben "klonen"? Das würde das Problem sofort lösen]
Wissen ist Macht - weiß nichts macht nichts
Handelsstationsvertreter
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

merlinschmidt wrote:ok da muss man es explizit machen
Richtig. Aus diesem Grund kam ich auch erst darauf dort zu suchen. ;)
merlinschmidt wrote:[btw: warum musst du auch im Unterprogramm dem Array wieder einen Wer zuweisen? Kannst du da nicht zur Not den Array eben "klonen"? Das würde das Problem sofort lösen]
Habe ich natürlich sofort gemacht. Es handelt sich hier um eine komplexe Datenbank. Im Unterscript werden dazu unter besonderen Begebenheiten weitere Berechnungen angestellt. Wenn man es weiß, kann es ja umgehen, nur ich musste erst mal darauf kommen. War nicht leicht in einem Wust von Zahlen. ;)

Gruß
Lucike
Image
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Array benehmen sich nicht wie lokale Variablen, dass wäre ein falscher Ausgangspunkt. Jedoch ist es wie allgemein üblich bei array-referenzen so, dass du in der Variable $array nur einen Zeiger hast, übergibst du diesen an das Unterscript wird der Zeiger kopiert, jedoch nicht das array. Alle Änderungen am Array werden deshalb an dem Orginal array vorgenommen. Benutze einfach $newarray = clone array $oldarray from 0 ... null. Damit wird das komplettes Array kopiert.

Vorteile bietet dieses Verhalten im Zusammenhang mit get/set local/global Variable... durch dieses Verhalten mußt du das set nur einmal im obersten Script aufrufen und kannst in allen Unterscripts aktuelle Daten im Array speichern.

siehe al.scripts von BalaGi & mir!

Gruß ticaki
Last edited by ticaki on Fri, 1. Oct 04, 10:10, edited 1 time in total.
Zur Zeit nicht aktiv
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Schon richtig, der Vergleich mit lokalen Variablen ist nicht ganz korrekt. Nur damit es auch Kollegen verstehen, die sich mit dem Programmieren im allgemeinen nicht so auskennen.
ticaki wrote:Vorteile bietet dieses Verhalten im Zusammenhang mit get/set local/global Variable... durch dieses Verhalten mußt du das set nur einmal im obersten Script aufrufen und kannst in allen Unterscripts aktuelle Daten im Array speichern.
Stimmt auch wieder, richtig genutzt ist das sogar eine Erleichterung. Mir persönlich wäre es aber lieber, wenn man es wie bei C++, wie bereits von merlinschmidt erwähnt, explizit machen muss. Aber na ja, man kann damit leben.

Gruß
Lucike
Image

Return to “X²: Die Bedrohung - Scripts und Modding”