[Lua/C++] Anfängerproblem

badday

Erfahrenes Mitglied
Moin zusammen,

ich bin absolut neu in Lua und habe nun ein kleines Problem. Folgender Code (in C++):


Code:
x=ui->lineEdit->text().toInt();
    lua_State *L =  luaL_newstate();
    luaL_openlibs(L);
    luaL_loadfile(L, "./lua_test2.lua");
    lua_getglobal(L, "getsin");
    lua_pushnumber (L, x);
    if(lua_pcall (L, 1,1 ,0)!=0)
        std::cout<<"Error"<<std::endl;


    erg = lua_tostring (L, -1);
    ui->lineEdit_2->setText(erg);
    lua_close(L);

x ist ein int, es bekommt einen gültigen Wert.
lua_tostring der Einfachheit halber, tonumber funktioniert auch nicht.
"Error" wird ausgegeben (nur zur Veranschaulichung) , daher ist der Fehler bei oder vor lua_pcall.

Hier die Lua-Datei:


Code:
function getsin (x)
return math.sin(x)
end

Der Aufruf von lua_tostring(L, -1) resultiert in: "attempt to call a nil value", was wenig verwunderlich ist, wenn pcall scheitert.

Die Lösung ist vermutlich völlig simpel, aber ich komm gerade einfach nicht darauf

Ich hoffe ihr habt Verständnis.

Gruß,

badday
 
Hi.

Die Funktion luaL_loadfile lädt nur die betreffende Datei, führt den Code aber nicht aus. Der Code liegt dann als Funktion auf dem Stack. D.h. nach luaL_loadfile mußt du noch lua_call oder lua_pcall aufrufen damit der Code auch ausgeführt wird. Oder du verwendest gleich das luaL_dofile Makro welches gleich luaL_loadfile und lua_pcall hintereinander aufruft.

Gruß
 
Zuletzt bearbeitet:
Komisch, ich dachte das geht so:
luaL_loadfile(L, "./lua_test2.lua"); //lädt die Datei, ok
lua_getglobal(L, "getsin"); //legt die Funktion auf des Stack
lua_pushnumber (L, x); //legt das Argument auf den Stack
if(lua_pcall (L, 1,1 ,0)!=0) //führt das ganze aus, mit einem Argument und einem Ergebnis

Liege ich da falsch?

Gruß,

badday
 
Komisch, ich dachte das geht so:
luaL_loadfile(L, "./lua_test2.lua"); //lädt die Datei, ok
lua_getglobal(L, "getsin"); //legt die Funktion auf des Stack
lua_pushnumber (L, x); //legt das Argument auf den Stack
if(lua_pcall (L, 1,1 ,0)!=0) //führt das ganze aus, mit einem Argument und einem Ergebnis

Liege ich da falsch?
Ja, da liegst du falsch. Das hab ich doch gerade erklärt? :confused:

Gruß
 
Sorry, aber du hast oben geschrieben:
"mußt du noch lua_call oder lua_pcall aufrufen"

Doch genau das mache ich doch mit
if(lua_pcall (L, 1,1 ,0)!=0)
(?)
 
Sorry, aber du hast oben geschrieben:
"mußt du noch lua_call oder lua_pcall aufrufen"

Doch genau das mache ich doch mit
if(lua_pcall (L, 1,1 ,0)!=0)
(?)
Du mußt erstmal den Code aus der Datei nicht nur mit luaL_loadfile laden, sondern auch ausführen. Denn erst danach ist auch die Funktion getsin global definiert.

Wie auch bereits gesagt, nimm einfach luaL_dofile.

\edit: luaL_dofile macht das hier:
C:
(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
Gruß
 
Zuletzt bearbeitet:
Du hast völlig recht, sorry, das ich nochmal nachgefragt habe.

Vielen dank für deine Geduld!

Gruß,

badday
 
Zurück