Lua - attempt to compare function with number



  • Hallo,

    ich habe nach diesem Tutorial:
    http://www.isogames.de/eine-einfuehrung-in-lua-r9.html

    eine Lua-Unterstützung in mein Spiel eingebaut.

    Eine meiner Funktionen ist GetMoney.
    Sie gibt eine Ganzzahl zurück (in Lua number)

    Wenn ich aber in meinem Skript schreibe:

    Money = GetMoney();
    if (Money <= 10) then
    

    dann wird Money die Funktion und nicht der Rückgabewert zugewiesen.
    Deshalb bekomme ich in der if Abfrage danach den Error:
    attempt to compare function with number

    Kann mir jemand sagen, was ich falsch mache?

    MfG

    PS: Ich nutze Lua 5.0, 1. weils im Tutorial so steht 😉 und 2. weil die neueste Version die Funktion lua_dofile aus dem Tutorial nicht erkennt.



  • Doofe Frage: sicher, dass GetMoney eine Zahl und nicht etwa eine Funktion zurückgibt? Ansonsten sieht der Lua-Code zumindest korrekt aus.



  • Ziemlich...

    int GetMoney(lua_State* L)
    {
        int iParamCount = lua_gettop(L);
        if (iParamCount==0)
        {
            lua_pushnumber(L, int(dMoney));
        }
        lua_pop(L, lua_gettop(L));
        return 1;
    }
    

    oder habe ich etwa hier einen Fehler gemacht?

    Danke für dein Interesse an meinem Problem 👍

    MfG



  • Dumme Frage: sagt return 1 nicht, daß da ein Fehler aufgetreten ist? Was passiert, wenn 0 zurückgegeben wird?

    Gruß Kimmi



  • Hi, danke für die Antwort.

    Nein, in Lua anscheinend nicht, im verlinkten Tutorial steht, dass hier das return angiebt, wieviele Werte zurückgegeben werden.

    MfG



  • Debug doch mal in den Code beziehungsweise bepflaster das Ganze mit printf, um zu sehen, ob der lua_pushnumber Befehl durchgeführt wurde. So auf die Schnelle sehe ich auch keinen Fehler.

    Gruß Kimmi



  • Magellan schrieb:

    Ziemlich...

    int GetMoney(lua_State* L)
    {
        int iParamCount = lua_gettop(L);
        if (iParamCount==0)
        {
            lua_pushnumber(L, int(dMoney));
        }
        lua_pop(L, lua_gettop(L));
        return 1;
    }
    

    oder habe ich etwa hier einen Fehler gemacht?

    Danke für dein Interesse an meinem Problem 👍

    MfG

    Für mich sieht das so aus, als ob du den Rückgabewert auf den Stack legst und ihn direkt wieder runterholst (der lua_pop Aufruf).
    Als Rückgabewert wird dann das genommen, was auch immer grad oben auf dem Stack liegt. In dem Fall müsste es die Funktion sein, die aufgerufen wird.

    Versuchs mal mit

    int GetMoney(lua_State *L)
    {
      lua_pushnumber(L, int(dMoney));
      return 1;
    }
    


  • int GetMoney(lua_State* L)
    {
        int iParamCount = lua_gettop(L);
        if (iParamCount==0)
        {
            lua_pushnumber(L, int(dMoney));
        }
        lua_pop(L, lua_gettop(L));
        return 1;
    }
    

    Dumme Frage: sagt lua_pop(L, lua_gettop(L)); nicht, dass der Stack leer gemacht wird? Damit ist doch auch direkt der Rückgabewert, der vorher gepusht wird, weg, oder nicht?



  • Ich muss sagen, ich habe noch nie mit der Lua-API gearbeitet und hab jetzt nur flüchtig im Referenzmanual geguckt, kann also sein, dass ich jetzt völlig daneben liege. Aber so wie ich das verstanden habe, bewirkt

    lua_pop(L, lua_gettop(L));
    

    dass alle Elemente vom Stack gelöscht werden (lua_gettop gibt die Anzahl zurück, lua_pop löscht n Elemente). Demnach wäre der Rückgabewert nil oder undefiniert oder die Funktion selbst oder irgendwie sowas, da kenn ich mich nicht genug aus.

    Edit: hm, zu spät...



  • Und gleich dreimal die Lösung!

    Ich muss zuerst lua_pop verwenden um die Parameter zu löschen und dann den Rückgabewert auf den Stack schieben.

    Danke euch allen 🙂



  • Magellan schrieb:

    Und gleich dreimal die Lösung!

    Ich muss zuerst lua_pop verwenden um die Parameter zu löschen und dann den Rückgabewert auf den Stack schieben.

    Danke euch allen 🙂

    Bist du dir sicher, dass man die Parameter selber löschen muss?
    In Programming in Lua wird das nicht gemacht.
    Der Stack existiert so weit ich mich erinnern kann nur für den Funktionsaufruf und wird danach sowieso wieder gelöscht.

    Edit:

    When a C function returns, Lua clears its stack;

    http://www.lua.org/pil/24.2.2.html vorletzter Abschnitt.

    Stack löschen würde ich nur, wenn du in der Funktion den Platz dringend brauchst.



  • Der Stack braucht nicht geloescht werden!


Log in to reply