Mi archivo Lua llamado "add4c.lua", código Lua como este:
function lua_sum(x,y,z) return x+y+z endMi código de archivo C es como:
#include "D:/luac/include/lua.h" #include "D:/luac/include/lualib.h" #include "D:/luac/include/lauxlib.h" #include <stdlib.h> #pragma comment(lib,"D:/luac/lib/lua51.lib") int main(void) { lua_State *L = luaL_newstate(); luaopen_base(L); luaL_openlibs(L); int error = luaL_dofile(L, "add4c.lua"); double r; for (int i = 0; i <= 200; i++){ lua_getglobal(L, "lua_sum"); lua_pushnumber(L, i+1); lua_pushnumber(L, i+2); lua_pushnumber(L, i+3); lua_call(L, 3, 1); r = lua_tonumber(L, -1); printf("%d\n", i); lua_pop(L, 4); } lua_close(L); return 0; }Mi versión de Lua es 5.1.4, y mi código c está compilado por Visual Studio 2013. Al ejecutar este código, provoca un error, simplemente detiene el código, pero no hay mensaje, y si cambio la cláusula de bucle como "i<=10 "Funciona bien, ¿cómo solucionar esto?
lua_call(L, 3, 1) consume 3 valores de pila y deja 1 cuando termina. Entonces, después de lua_call(L, 3, 1) solo hay un valor en la pila, por lo que lua_pop(L, 4) está extrayendo demasiados valores y saliendo de la pila interna, de ahí el bloqueo. Utilice lua_pop(L, 1) en su lugar.
Si reconstruye Lua con LUA_USE_APICHECK definido, recibirá un mensaje de error de una afirmación interna la primera vez que llame a lua_pop(L, 4) .