Lua-Funktion in C/C++ aufrufen



  • Hey,

    ich würde gerne einige Funktionen aus einem Lua Script durch ein C/C++ Programm aufrufen. Ich stelle mir das exemplarisch so vor:

    Lua:

    function blub(parameter)
    {
     print(parameter);
    }
    

    Diese Funktion möchte ich nun aus C++ heraus aufrufen. Damit nicht genug, ich möchte auch ihren Rückgabewert haben. Es soll eine Art Pluginschnittstelle :werden:

    Lua:

    init()
    {
     return INIT_DONE(parameter);
    }
    

    Ist das überhaupt möglich? Wie binde ich auch Sachen, wie INIT_DONE ein?

    Vielen Dank 🙂



  • Wenn du Lua von und zu C++ aufrufen willst, ist folgendes vielleicht interessant:

    http://www.rasterbar.com/products/luabind.html



  • Hey,

    ich konnte das Problem gewissermaßen selber lösen. Ich habe zufällig in diesem Artikel gesehen, wie man eine Funktion in Lua aufrufen kann. Ich habe mir dann den Rest dazugebastelt, so dass ich nun eine Funktion samt Parameter und Rückgabewert(en) aufrufen kann. Das reicht mir zunächst 🙂 Danke.



  • asdasdasd schrieb:

    Hey,

    ich konnte das Problem gewissermaßen selber lösen. Ich habe zufällig in diesem Artikel gesehen, wie man eine Funktion in Lua aufrufen kann. Ich habe mir dann den Rest dazugebastelt, so dass ich nun eine Funktion samt Parameter und Rückgabewert(en) aufrufen kann. Das reicht mir zunächst 🙂 Danke.

    Hmm, nur wenn ich mit lua_pushlightuserdata eine mit new angelegte Klasse auf den Stack lege und diese später wieder mit lua_touserdata abhole, dann scheint diese nicht 100% zu klappen. Zum Beispiel mit new angelegter Speicher scheint nicht zugreifbar oder std::string ist ungültig. In dem Fall muss ich dann wohl mit malloc arbeiten, weil Lua in C geschrieben ist?



  • Nein, ich hatte solche Probleme nicht.

    dann scheint diese nicht 100% zu klappen. Zum Beispiel mit new angelegter Speicher scheint nicht zugreifbar

    Sehr vage Fehlerbeschreibung. Code schadet bestimmt auch nicht.



  • knivil schrieb:

    Nein, ich hatte solche Probleme nicht.

    dann scheint diese nicht 100% zu klappen. Zum Beispiel mit new angelegter Speicher scheint nicht zugreifbar

    Sehr vage Fehlerbeschreibung. Code schadet bestimmt auch nicht.

    Der Quellcode des C++ Programms:

    #include <iostream>
    #include <string>
    
    extern "C" 
    {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    }
    
    class Return
    {
    private:
    	std::string str;
    
    public:
    	Return(const std::string& s) : str(s)
    	{
    	}
    
    	void print() { std::cout << "print()" << std::endl; }
    
    	const std::string& getStr() const { std::cout << "getStr()\n"; return str; }
    };
    
    int ReturnStatusOk(lua_State *L)
    {
    	lua_pushlightuserdata (L, new Return("OK"));
    
    	return 0;
    }
    
    int ReturnStatusError(lua_State *L)
    {
    	lua_pushlightuserdata (L, new Return("ERROR"));
    
    	return 0;
    }
    
    int main()
    {
    	lua_State *L = lua_open();
    
    	luaL_openlibs(L);
    
    	lua_register(L, "STATUS_OK", ReturnStatusOk);
    	lua_register(L, "STATUS_ERROR", ReturnStatusError);
    
    	int source = luaL_loadfile(L, "test.lua");
    
    	if (source != 0)
    	{
    		std::cerr << "Error: could not open test.lua\n";
    		return 1;
    	}
    
    	source = lua_pcall(L, 0, LUA_MULTRET, 0);
    
    	if (source != 0)
    	{
    		std::cerr << "Error: " << lua_tostring(L, -1) << "\n";
    		lua_pop(L, 1);
    		return 1;
    	}
    
    	lua_pushliteral (L, "main");
    
    	lua_gettable(L, LUA_GLOBALSINDEX);
    
    	source = lua_pcall(L, 0, 1, 0);
    
    	if (source != 0)
    	{
    		std::cerr << "Error: " << lua_tostring(L, -1) << "\n";
    		lua_pop(L, 1);
    		return 1;
    	}
    
    	Return *status = static_cast<Return *>(lua_touserdata(L, -1));
    
    	// Das klappt
    	status->print();
    
    	// Und das hier klappt nicht => Programm stürzt ab
    	std::cout << status->getStr() << std::endl;
    
    	delete status;
    
    	lua_pop(L, 1);
    
    	lua_close(L);
    }
    

    Der Fehler tritt in der Zeile 86 auf. Ich kann ihn mir leider nicht erklären und daher auch nicht beheben. Der Fehler tritt beim Zugriff auf die Variable test auf. Die Funktion print wird ohne Probleme ausgeführt, da kein Zugriff auf test erfolgt.

    Der Quellcode des Lua Programms (test.lua):

    function main()
    	io.write("main()\n");
    
    	STATUS_OK(); -- Crash
    
    	return 0;
    end
    

Anmelden zum Antworten