Argument als variabel ?

  • GM 8

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

  • Argument als variabel ?

    Ich bin auf ein Problem gestoßen und hoffe dass mir der eine oder andere dabei helfen kann :headtouch:

    Ich versuche ein Skript zu schreiben das möglichst flexibel ist jetzt wäre es toll wen ich als Argument eine eigene variabel einfügen könnte al meine versuche dies zu tun sind gescheitert habe entweder schon vergessen wie der Befehl dafür ist oder habe ihn einfach nicht gefunden

    An bei ein Beispiel damit man sich das besser vorstellen kann wie ich das meine.

    GML-Quellcode

    1. Script (argument)
    2. argument += 100
    zu erwähnen ist noch das ich im Argument mit with (object_test) innerhalb eines anderen Objekt arbeite zudem das Argument gehört
  • Argumente werden beim Aufrufen einer Funktion übergeben, danach nicht mehr. Was du machen kannst ist, dass du am Anfang des Scriptes das Argument auf eine (Globale) Variable überträgst, diese kann dann von Außen zu jeder Zeit bearbeitet werden.
  • Die einem Skript übergebenen Argumente kannst du innerhalb dieses Skriptes direkt verarbeiten - das geht folgendermaßen:

    GML-Quellcode

    1. // sagen wir mal, ein Skript foo(a,b) soll einfach a+b addieren:
    2. return argument[0]+argument[1];
    3. //aufrufen würdest du dieses Skript dann folgendermaßen:
    4. foo(zahl1,zahl2);


    Falls es da Unklarheiten gibt, sei dir gesagt, dass zahl1 und zahl2 sowohl direkt Zahlen sein können als auch die Namen von Variablen, hinter denen sich Zahlenwerte verstecken. Würdest du also im Create-Event festlegen, dass

    GML-Quellcode

    1. zahl1=22;
    2. zahl2=20;

    dann wäre das Ergebnis von

    GML-Quellcode

    1. zahl3=foo(zahl1,zahl2);
    2. // oder:
    3. zahl3=foo(22,20);

    dass zahl3 den Wert 42 annimmt.

    War das, was du mit "als argument eine eigene Variable einfügen" meintest?

    Edit/Addendum/whatever:
    Ich sollte evtl. noch anmerken, dass sich in deinem Beispiel ein gern gemachter Anfängerfehler versteckt: "argument" ist ein reservierter Name, so wie "global" oder "score" - den als Variablennamen zu verwenden, wo das nicht vorgesehen ist, kann fiese Bugs produzieren. Benutz "argument" also immer nur innerhalb von Skripten. Das nur als vorausschauender Hinweis. ^^
  • xGamer336 Deine Antwort hat mir etwas geholfen doch möchte ich leider das nicht über globalevariabelen lösen.
    danke für die schnelle Antwort.


    Argumente werden beim Aufrufen einer Funktion übergeben, danach nicht mehr. Was du machen kannst ist, dass du am Anfang des Scriptes das Argument auf eine (Globale) Variable überträgst, diese kann dann von Außen zu jeder Zeit bearbeitet werden.





    Irrenhaus3 Deine Antwort war nicht sehr hilfreich aber ich habe mich auch nicht besonders gut ausgedrückt. Was mein Feller war ich formuliere es um mit Hilfe deines Beispiels um es verständlicher zu machen.

    Ich benötige nicht zahl1 oder zahl 2 als Argument sondern foo!


    GML-Quellcode

    1. [quote]
    2. // sagen wir mal, ein Skript foo(a,b) soll einfach a+b addieren:
    3. return argument[0]+argument[1];
    4. //aufrufen würdest du dieses Skript dann folgendermaßen:
    5. foo(zahl1,zahl2); /*foo ist das Argument was ich brauche*/
    6. [/quote]


    Es ist mein Ziel mein Skript hier zu veröffentlichen und anderen die Möglichkeit zu geben selber die zu bearbeitende variabel zu ändern ohne am Skript rumzudoktern weil ja jeder andere variablen benutzt.

    Ich hoffe das ich mich jetzt verständlicher ausgedrückt habe und hoffe das mir einer helfen kann.
  • Ich habe ehrlich gesagt keine Ahnung was du erreichen möchtest.

    Du möchtest als Argument0 deine eigene Variable einfügen und als Argument1 den Wert, ohne diese Variable im Create Event festzulegen zu müssen?
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • Ich glaub ich weiß jetzt, worauf du hinauswillst. Du willst dem Skript den Namen einer Variablen übergeben und dann soll der Skript die Variable mit diesem Namen verändern, richtig? Für sowas gibt es Funktionen mit Namensanfängen wie variable_local_* und variable_global_* - diese Funktionen erwarten als Parameter den Namen einer lokalen bzw. globalen Variablen (übergeben als String) und modifizieren diese Variablen dann entsprechend deiner Angaben. Das ist allerdings eine seeeeeeehr rudimentäre und ungemütliche Sache und sollte eigentlich nur verwendet werden, wenn's gar nicht anders geht. Ein Beispiel:

    GML-Quellcode

    1. // Nennen wir diesen Skript mal wieder foo(name)
    2. var name;
    3. name=argument[0];
    4. if variable_local_exists(name){
    5. variable_local_set(name,variable_local_get(name)+1);
    6. }
    7. // Und so ruft man ihn auf:
    8. foo('bla');

    Dieser Widerling eines Skriptes ersetzt folgenden Code:

    GML-Quellcode

    1. bla+=1;

    Und da du den name-Parameter als String vorliegen hast, kannst du die Variable "bla" nicht direkt mit der Syntax "(name) (operator) (wert)" ansprechen, sondern musst das über diese Funktionsverschachtelung lösen. Siehst du, was ich mit Ungemütlich meine? ^^

    Ich weiß zwar nicht, was genau du da grade zusammenbastelst, aber wenn es sich um komplexere Materie handelt, gibt's eigentlich keinen Grund, nicht noch mehr als einfach nur den Skript zu veröffentlichen - der am Ende vielleicht tut, was er soll, aber wegen allen möglichen abgehandelten Exceptions so riesig ist, dass keiner mehr durchblickt. Der GM hat da diese praktische Export-Resources-Funktion; du kannst also alle für wasauchimmer du baust nötigen Objekte und ihre abhängigen Skripte zusammen exportieren und in ein zip-Archiv packen. Nur, um da mal nen alternativen Ansatz eingebracht zu haben.
  • Tatsache, das wurden sie...
    In dem Fall bleibt eigentlich, da der GM auch weiterhin noch nie was von Pointern gehört hat, nichts anderes übrig als ein ekliges Workaround in der Richtung: Alle Werte, die irgendwann mal wichtig werden in eine ds_list packen und dann über dein Skript den übergebenen Namen einer Nummer zuweisen (oder gleich als Konstante definieren) und dann an der entsprechenden Stelle in der Liste den Wert rauspicken, modifizieren und wieder abspeichern. Oder einfach all diese Variablen global machen, wenn Speicherbelastung keine Rolle spielt. So oder so; ich kann mir kaum denken, dass es wirklich eine gute Idee ist. Die Variante mit den zusätzlich exportierten essentiellen Ressourcen scheint mir da vernünftiger.
  • Call by Reference kann der GM (leider?) nicht so direkt (so nennt man das, was du haben willst).

    Im GM gibt es aber dennoch Dinge, von denen du auch Referenzen benutzen kannst: Instanzen/Objekte und Datenstrukturen. Da ist es dann egal, wie die heißen, du müsstest der Funktion halt nur den Verweis auf die Datenstruktur übergeben (ds_map bietet sich dafür z.B. an).

    Aber bleibt immer noch die Frage, warum man dem Benutzer nicht das hier zumuten kann:

    GML-Quellcode

    1. val = foo(val);