Lua - attempt to compare function with number
-
Hallo,
ich habe nach diesem Tutorial:
http://www.isogames.de/eine-einfuehrung-in-lua-r9.htmleine 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 numberKann 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!