[gelöst] LuaBind call_function mit Lua Modulen
-
Hallo,
in meinem Projekt nutze ich neuerdings Lua mit LuaBind;
in Lua verwende ich Lua-Module.
Zum Test hab ich mir erstmal folgendes zusammengeschrieben:luaL_loadstring(LuaState, ("require('main');")); int error = lua_pcall(LuaState, 0, LUA_MULTRET, 0); if(error != 0) printErrors(); try { luabind::call_function<void>(LuaState, "main.onStart"); } catch (luabind::error& e) { std::string error = lua_tostring(LuaState, -1); std::cout << error << std::endl; }
Meine Lua Datei main.lua sieht wie folgt aus:
module("main", package.seeall); function onStart() end
Das Problem ist, dass ich beim call_function den Fehler "attempt to call a nil value" bekomme - dabei existiert main.onStart() ja und wurde auch definitiv vorher geladen (require("main");).
Ob man Funktionen in Lua Modulen anders aufruft, konnte ich bisher im Netz nicht finden.
Kennt sich hier vielleicht jemand damit aus oder hat eine Idee, was ich falsch mache? Ich bin dankbar für alle TippsBlay09
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Versuch mal in dem try-Teil vor dem call_function eine Debug-Ausgabe:
lua_getglobal(LuaState, "main"); if (!lua_istable(LuaState, -1)) fprintf(stderr, "** main ist keine tabelle"); else fprintf(stderr, "** an main liegt es scheinbar nicht");
Mal sehen, was da rauskommt. Es könnte sein, dass 'main' gar nicht bekannt ist, oder, dass 'main' zwar bekannt ist, aber main["onStart"] nicht. Beides würde nil ergeben.
Edit: da stand L statt LuaState, dumme Gewohnheit.
-
Hallo,
hab's gemacht, Ergebnis war dass es nicht an main liegt.
Als ich die Funktion noch ohne LuaBind aufgerufen hatte, ging es übrigens:lua_getglobal(LuaState, "main"); lua_pushstring(LuaState, "onStart"); lua_gettable(LuaState, -2); assert(lua_isfunction(LuaState,-1)); lua_pcall(LuaState, 0, LUA_MULTRET, 0);
Will es jetzt aber der Einfachheit halber auf LuaBind umschreiben.
Das heißt, daran dass onStart bzw. main nicht richtig bekannt ist, kann es ja eigentlich nicht liegen.Aus der LuaBind Doku:
There are two overloads of the call_function function, one that calls a function given its name, and one that takes an object that should be a Lua value that can be called as a function.
The overload that takes a name can only call global Lua functions.
Vielleicht sind die Funktionen in main nicht global? Ich weiß nicht. Wann sind sie denn global?
Edit:
Hab es daraufhin jetzt mal mit der Objektvariante versucht. Damit funktioniert's.
Hier mein Aufrufscode:lua_getglobal(LuaState, "main"); lua_pushstring(LuaState, "onStart"); lua_gettable(LuaState, -2); assert(lua_isfunction(LuaState, -1)); luabind::object o(luabind::from_stack(LuaState, -1)); luabind::call_function<void>(o);
Danke für die Hilfe
-
blay09 schrieb:
Vielleicht sind die Funktionen in main nicht global? Ich weiß nicht. Wann sind sie denn global?
Alles klar. Die meinen wahrscheinlich, dass die Funktion unmittelbar im globalen Environment sein muss. Die Environments in Lua sind einfache Tabellen, das globale Environment hat den Namen
_G
:> for k, v in pairs(_G) do print(k, v) end -- zeigt alle globalen Variablen an
Die Überladung, die den Namen nimmt, macht scheinbar nichts anderes, als in _G nachzusehen, ob es ihn gibt, was z.b. für
_G["main"]
der Fall ist, aber nicht für_G["main.onStart"]
, weil man die Funktion unter_G["main"]["onStart"]
findet. Auf diese Weise wirdmain.onStart
sonst ausgewertet, nur dürfte call_function() für diese Auswertung zu sparsam sein.Alles klar?
-
Ja, danke für die Aufklärung