Probleme mit lokalen und globalen 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

schnobs
Posts: 79
Joined: Sat, 9. Dec 06, 14:57

Probleme mit lokalen und globalen Variablen

Post by schnobs »

Soooo. Mein erstes Skript, ein recht simpler Satellitenverteiler. Ein häßliches Entlein. Funktionieren tut's auch nicht.

Soweit ich mit dem debugger bisher gekommen bin, liegt das Problem irgendwo beim Import / Export von Variablen. Der klassiche Fehler wären wohl Tippfehler beim Namen der Variablen... zumindest das kann ich auschließen.

Ein kleines Beispiel:

im Setup-Skript

Code: Select all

001   $textID = 1312
002   $pageID = 1002
[...]
011   set global variable: name=$pageID.satdrop value=$pageID
012   set global variable: name=$textID.satdrop value=$textID
013   return null
im nächsten Skript

Code: Select all

001   $textID = get global variable: name=$textID.satdrop
002   $PageID = get global variable: name=$pageID.satdrop
Laut debugger wird beiden Variablen derselbe Wert zugewiesen (1312, das ist die textID).

An anderer Stelle exportiere ich eine Liste von Sektoren als Array. Das wird gar nicht erst geladen, oder was auch immer; jedenfalls hat behält die Variable im Tochter-Skript ihren Wert von "DATATYP_NULL, null, (0)"

Ein komplettes Listing des Codes gibt es hier:
http://www.x-lexikon.xibo.at/wiki/index ... bs/Skripte

Ihr dürft von mir aus gerne euren Senf zwischen den Code dort schreiben.

Wahrscheinlich habe ich nur Tomaten auf den Augen. Aber sei dem wie es will, ich schau' mir das jetzt schon seit ein paar Stunden an und komme nicht dahinter.

Herzlichen Dank für jeden Hinweis.
User avatar
Chris Gi
Posts: 960
Joined: Wed, 20. Sep 06, 09:57
x3tc

Post by Chris Gi »

Sag mal, ist das X3-Syntax? Wenn ja, poste dort, ich kenne die neue Syntax nämlich nicht. Oder arbeitest Du mit einem externen Editor?

Wenn doch für X2:
Ich kann im SE keinesfalls "$textID" eingeben, nur "textID". Wie kriegst Du das hin?
Für mich sieht das so aus, als wäre der Name für die globale Variable nicht initialisiert. Der Name der Variablen ist als Var/String zu übergeben. Du müßtest also den Namen über eine der sprintf-Funktionen aus Deiner Variablen und dem ".satdrop" zusammensetzen. So, wie das jetzt läuft, weist Du einer globalen Variablen namens "NULL" erst die PageID und unmittelbar darauf die TextID zu.
Im nächsten Skript hast Du das gleiche Phänomen, wieder ist der Name nicht initialisiert, also NULL, und daher liest Du zweimal Deine globale Variable "NULL", die ja jetzt die TextID enthält, da die zuletzt zugewiesen wurde.

Und einen ähnlichen Fehler machst Du mit der Sektorenliste in plugin.satdrop.start:

Code: Select all

109   [THIS] -> set local variable: name=$SectorList value=$SectorList
110   [THIS] -> set local variable: name=$SatType value=$SatType
Hier benutzt Du ein Array als Name für die lokale Variable bzw. bei SatType eine Nummer. Versuche das mal wieder auszulesen. Nenn das Ding doch einfach "schnobs.sectorlist" oder so.

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

Post by UniTrader »

das $ wird immer automatisch vor ne Variable gestellt :roll:

@schnobs: probiers mal sorum: statt dass du <Variable> beim Variablennamen angibst wähle <String> aus, sodass es so aussieht:

Code: Select all

001   $textID = 1312
002   $pageID = 1002
[...]
011   set global variable: name='pageID.satdrop' value=$pageID
012   set global variable: name='textID.satdrop' value=$textID
013   return null 

Code: Select all

001   $textID = get global variable: name='textID.satdrop'
002   $PageID = get global variable: name='pageID.satdrop' 
kleine Frage noch: wieso verwendest du für die PageID ne GV??? es reicht doch, wenn du sie direkt im Script eingibst, weil es hier nicht so schnell zu änderungen kommt wie bei der PageID...
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)
schnobs
Posts: 79
Joined: Sat, 9. Dec 06, 14:57

Post by schnobs »

Chris Gi wrote: Ich kann im SE keinesfalls "$textID" eingeben, nur "textID". [...]
Der Name der Variablen ist als Var/String zu übergeben.
Wie ich das hinbekommen habe?
Ich verwende den internen SE von X2, v1.4. An dieser Stelle kann ich jede bereits gesetzte Variable auswählen; sogar [THIS], [SECTOR] usw stehen zur Verfügung; zu guter letzt auch "null", "<Variable>" und "<String>". Nachdem es "lokale *variable*" heißt, war es für mich selbstverständlich, an dieser Stelle auch "Variable" zu wählen.

Var/String also. Ach du Grundgütiger. Ja, bei genauerem Hinsehen fehlt den lokalen/globalen Variablen in anderen Skripten das $-Zeichen am Anfang. Wär ich nie drauf gekommen. Vielen Dank für deine Hilfe!


UniTrader wrote:kleine Frage noch: wieso verwendest du für die PageID ne GV?
Weil ich keine Ahnung habe, was vernünftig ist und was nicht? Falls du dir den Code anschaust, wirst du sicher so einiges an Redundanz finden. Oder Ansätze à la "von hinten durch die Brust ins Knie", die sich auch viel eleganter machen ließen. Oder, oder...

(ganz abgesehen davon daß der Code noch ungetestet ist und wahrscheinlich voller Fehler steckt. Das mit den Variablen als String war sicher nur der erste...)[/i]
User avatar
Chris Gi
Posts: 960
Joined: Wed, 20. Sep 06, 09:57
x3tc

Post by Chris Gi »

UniTrader wrote:das $ wird immer automatisch vor ne Variable gestellt
Mach mich doch nicht fertig :D . Überlese ich das denn immer? Na ja, blindes Huhn findet auch mal ein $-Zeichen....
schnobs
Posts: 79
Joined: Sat, 9. Dec 06, 14:57

Post by schnobs »

Klappt ja prima... das Schiff ist jetzt immerhin schonmal losgezuckelt und hat sich mit Satelliten versorgt.

Aber beim verteilen zwickt's:

(eigentlich eine neue Frage, aber ich will nicht ständig neue Threads aufmachen)

Und zwar an der Stelle:

039 if is datatyp[ $tempSec ] == [SECTOR]

Im Debugger zeigt er mir für $tempSec "DATATYP_SECTOR, Königstal (-13)"; damit sollte die Bedingung doch WAHR sein, oder? Dennoch wird der gesamte if-Block einfach übersprungen und das Skript setzt seine Arbeit erst viel weiter hinten fort (bei Zeile 73, um genau zu sein).

Nebenfrage: was bedeutet das (-13) hinter dem Sektornamen?
User avatar
SymTec ltd.
Posts: 5285
Joined: Mon, 11. Apr 05, 21:11
x3tc

Post by SymTec ltd. »

"[SECTOR]" ist die Konstante des Sektors, in dem sich das Objekt, auf dem das Script läuft, gerade aufhält.

Was du wissen willst, ist "Datatyp_Sector", zu finden in der Rubrik "Script Data Types".
schnobs
Posts: 79
Joined: Sat, 9. Dec 06, 14:57

Post by schnobs »

Aua.

Man sagt ja immer, daß alle Programmierer einen recht hohen Haaransatz haben, vom vielen sich-an-die-Stirn-greifen. So langsam bin ich bereit, das zu glauben.

Danke.

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