Mehrere Rückgabewerte bei Funktionen

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

  • Mehrere Rückgabewerte bei Funktionen

    Eine Funktion, die ich in einem Spiel benutze, soll die x-, y- und z-Koordinaten eines Objekts zurückliefern.
    Dafür gäbs in anderen Programmiersprachen die Möglichkeiten ein Array zurückzuliefern oder der Funktion drei Variablen per "Call by reference" bzw drei Zeiger zu übergeben die dann in der Funktion verändert werden.
    Ist etwas vergleichbares im GM möglich?

    (edit: Ups, hab es unabsichtlich bei den komplexen Fragen gepostet, bitte um Verschiebung...)
    Aktuelles Projekt: Katamari

    @interceptor: Tortoise ftw ^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von conan2 ()

  • Du könntest höchstens das ganze zu einem String zusammensetzen und wieder auseinandernehmen. Oder du baust die Funktion so, dass sie eigentlich 3 Funktionen enthält, die seperat angesprochen werden. Dass dann eben per switch und 3x ansprechen.
  • Original von King Andre
    Du könntest höchstens das ganze zu einem String zusammensetzen und wieder auseinandernehmen.

    Das halte ich für zu kompliziert, das sollte man doch per Array zu erledigen sein?
    Und wenn nicht würde ich eher die Zahlen in einem Integer zusammenfassen und daraus mit Modulo rausholen, der umweg über Strings ist da nicht nötig - er ist eh langsamer.
  • [qote]Und wenn nicht würde ich eher die Zahlen in einem Integer zusammenfassen und daraus mit Modulo rausholen[/quote]nciht das ich es brauchen würde, aber das klingt interessant, wie würdest du sowas machen? bei 2 zahlen könnte ich mir das ja noch vorstellen, indem eine das ganzzahlige ergebniss, und das andere der rest ist, aber das geht nur bei ganzen zahlen, und dan auch nur bei 2 . könntest du das erklären? danke.

    und die möglichkeit mit dem array ist bei sowas wohl die beste möglichkeit. die kann man nämlich am besten wieder einlesen [gml]x = funktion(abc)[0];
    y = funktion(abc)[1];
    z = funktion(abc)[2];[gml]
    :) Nobody is perfect (-:

    "Dummköpfe sind Denkerköpfen weit überlegen. Zahlenmäßig." Ernst Ferstl
  • Das mit den drei Funktionen hab ich auch schon in Erwägung gezogen, aber das Problem dabei ist dass für die Berechnung der Koordinaten wiederum Berechnungen nötig sind, die für alle drei Koordinaten gleich sind. Wenn ich das also in Funktionen aufspalte dann müssten einige Dinge dreifach berechnet werden.

    @boxxar: Das mit dem zusammennehmen der Werte ist leider ebenfalls nicht möglich weil es sich nicht um Integer-, sondern um Gleitkommazahlen handelt und da wäre die Sache mit Modulo sicher unnötig kompliziert und ich wüsste dann nicht mehr wie man das lösen könnte.

    Wahrscheinlich ist dann doch das beste die Funktion einfach jedes Mal inline zu schreiben, da sie gott Sei Dank nicht unmöglich lang ist und auch nicht an so vielen Stellen eingesetzt wird.

    Vielleicht probier ich auch mal das ganze mit der 3D-Engine von GM zu lösen dann brauch ich diese Funktion gar nicht mehr :ops:

    edit:
    @Nobody-86: Gut, dieser Syntax war mir bisher unbekannt :)
    Ich habs immer mit sowas wie

    GML-Quellcode

    1. ret=funktion(...);
    2. x=ret[0];
    3. y=ret[1];
    4. z=ret[2];

    probiert, aber so hats irgendwie nicht geklappt. Damit wäre mein Problem dann erledigt, danke vielmals für die vielen Lösungsvorschläge :happy:
    Aktuelles Projekt: Katamari

    @interceptor: Tortoise ftw ^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von conan2 ()

  • @Nobody:
    Naja, du definierst die maximale Größe, ich sag jetzt mal 1000.
    Wenn du dein Rückgabewert erstellst machst du also:

    Quellcode

    1. retval = x * 1000000 + y * 1000 + z

    Und zum zurück verwandeln:

    Quellcode

    1. z = retval MODULO 1000
    2. retval = retval - z
    3. retval = retval / 1000
    4. y = retval MODULO 1000
    5. retval = retval - y
    6. retval = retval / 1000
    7. x = retval

    (Pseudocode)

    [EDIT]:
    Das mit den Gleitkommazahlen konnte ich nicht wissen, weil man Koordinaten idR mit Pixlen angibt und es gibt ja keine halben Pixel ;)
  • Stimmt das konntest du in der Tat nicht^^
    Der Grund warum ich für die Koordination Gleichkommazahlen benutzen muss ist, dass das Objekt um einen Mittelpunkt kreist und sich die neuen Koordinaten aus den alten berechnen und somit würde das Objekt nach der Zeit sonstwo hinfliegen wenn ich bei der Berechnung immer wieder runde...
    Aktuelles Projekt: Katamari

    @interceptor: Tortoise ftw ^^
  • Es ist überhaupt kein Problem, innerhalb einer Funktion arrays zu erstellen bzw. mit Werten zu füllen, und die dann vom Objekt auslesen zu lassen. Man braucht dafür auch keinen return-Befehl. Wenn Du darauf verzichtest, die Variablen im Skript mit var lokal zu deklarieren, werden sie in der ausführenden Instanz gespeichert. Das meintest Du doch, oder?
  • was du auch machen koenntest:
    Du koenntest ein Objekt erzeugen (im Grunde egal was fuer eins) und dann die Variablen _x, _y und _z setzen. Dann gibste in der Funktion die ID zurueck und im Programm benutzte dann einfach id._x oder so.

    EDIT: Jau, oder wie Melancor einfach die Werte in globale Variablen schreiben.
    Robots are cool because they're made of metal and metal is usually a few degrees below the ambient temperature.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Icy Wolf ()