Referenzparameter

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Referenzparameter

    Hallo Leute!

    Ich hab mal ne Frage zu Scripten.
    Wenn ich da ein Script habe, das Parameter verwendet, dann muss ich die ja nic extra definieren, sondern einfach nur <argument0> <argument1> usw. benutzen.
    Ich bin grad an einem Script mit Parameterübergabe. Das script soll am Ende aber mehrere Werte zurückgeben. Mit return kann man natürlich nur ein wert zurückgeben. Eine Lösung wäre, mit Referenz- oder auch Variablenparametern zu arbeiten. Ein Bsp. dazu:

    Wenn ich das script aufrufe:

    script(variable);

    dann wird in dem script zunächst gerechnet und dann auch irgendwann <variable> überschrieben. Bei "normalen" Parametern würde das keine auswirkung haben aber bei Referenzparametern wird nun <variable> außerhalb des scripts überschrieben weil der Parameter im script geändert wurde.

    Bei andern Programmiersprachen Funktioniert das z.B so:

    script(VAR variable : INTEGER);

    das "VAR" zeigt an, dass die folgenden Variablen Referenzparameter sind.


    Aber wie geht das nun in Game Maker, wo man die Parameter nicht selber festlegen kann?


    Ich danke jetzt schon mal!!
  • in etwa sowas?

    skript: variable_aendern

    GML-Quellcode

    1. execute_string(argument0 + " = " + string(argument1) + ";");

    aufruf:

    GML-Quellcode

    1. variable_aendern("einevariable",5);

    der variablen "einevariable" wird der wert 5 zugewiesen.
    Allerdings ist execute_string nicht sehr schnell daher nich immer zu empfehlen
  • ups xiebel war schneller :D
    das wird wohl richtig sein...

    ich bin mir nicht ganz sicher was du meinst, aber eine variable wird nur überschreiben, wenn man selber dafür sorgt.
    wenn ich also ein skript aufrufe mit:
    script(variable);
    muss ich das argument ja auch irgendwie im skript verwenden. z.b. so
    var0=argument0;
    das übergebene argument ist somit nur sekundär und schon im nächsten step nicht mehr verfügbar. nur die variable "var0" wäre nun noch verfügbar.

    und script(VAR variable : INTEGER); müsste eigendlich funktionieren wenn du es so schreibst: script(var name=real(wert));

    wie gesagt, ich bin mir aber auch nicht sicher, weil ich mir proggen so ziemlich selber beigebracht habe, und mit fremder syntax meistens überfordert bin :D
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von WIN ()

  • Naja, das echte problem an dem ganzen Konzept ist das GML eine Script sprache ist und soweit ich mich erinnern kann keine Zeiger als datentyp besitzt (anm. der Red.: Zeiger zeigen auf die Physikalische position der Variable im Hauptspeicher), ergo ist das ändern mehrere variablen bei einem Funktionsaufruf ohne Workaround nicht möglich. Der Sinn einer Funktion im mathematischen sinn ist ja auch , das nur ein Wert zurück kommt. Jetzt kommen für dein Problem mal 2 Lösungen in frage.

    Erste Lösung:

    Du erstellt für die Funktion welche mehrere Werte zugleich verändern soll globale Variablen. wenn du jetzt die Funktion aufrufst werden in der Funktion die Globalen Variablen geändert. Den return wert kannst du noch für eine eventuelle Fehler koorektur benutzen (z.b. false returnen wenn du ungültige parameter bekommst).

    2te lösung. Der Push/Pop weg. Assambler Programmierer wissen was auf sie zukommt :3.

    Du kannst irgendo ein globales Array anlegen, und einen Globalen Index (also eine Variable die auf die 0te position des Arrays zeigt). jetzt machst du eine funktion push, die eine Variable in das aktuelle Feld des arrays speichert und den Index um eins erhöht. Eine zweite Funktion Pop hohlt sich die Daten des aktuellen Index und senkt diesen wieder um eins. Das ganze kann dann ca so aussehen:

    Quellcode

    1. push(var1);
    2. push(var2);
    3. push(var3);
    4. funktion();
    5. var3 = pop();
    6. var2 = pop();
    7. var1 = pop();


    die funktion benötigt dann was das ca so aussieht

    Quellcode

    1. funktion
    2. {
    3. var3 = pop();
    4. var2 = pop();
    5. var1 = pop();
    6. //wasauchimmer hier passiert
    7. push(var1);
    8. push(var2);
    9. push(var3);
    10. }

    hat im gegensatz zur ersten methode den Vorteil das man nicht 100 000 globale Variablen brauchst, ist aber (im gegensatz zur orginal Assambler Version) unnötig viel Sript source zum ausführen.
    ...
  • Das tolle an der Scriptsprache ist aber auch, dass man von überall die Variablen verändern kann.
    @Bl@ckSp@rk: Du kannst in deinem Script die gewünschte Variable einfach ändern. z.B. so:

    GML-Quellcode

    1. [script_foo]x = 1345456*8;
    2. speed = "You are dumb.";[/script_foo]
  • Ähm, warum macht ihr das alle so schwer?

    Übergebt die Variable als string, z.B. BerechneWas('zielvariable')

    und im Skript dann

    GML-Quellcode

    1. variable_local_set(argument0, BerechneterWert)


    Variablensetzung gibt es schon, da müsst ihr keine irre komplizierten Skripte machen, GM Hilfe -> Game Play -> Miscellaneous variables and functions

    Man kann auf diese Weise alle Variablen (lokal und global) und alle Array Typen auf existenz prüfen, Werte setzen und Werte abfragen und das mit einem String als Parameter.

    Es ist wohl so wie Mark immer sagt, das der Game Maker mächtig ist aber das Unwissen zu schlechter Programmierung führt... :(
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum