我的lua文件名为“add4c.lua”,lua代码如下:

function lua_sum(x,y,z)
    return x+y+z
end

我的C文件代码如下:
#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;
}

我的lua版本是5.1.4,我的c代码是由visual studio 2013编译的。当运行此代码时,它会导致一个错误,只需停止代码,但不显示任何消息,如果我更改“i

最佳答案

lua_call(L, 3, 1)将使用3个堆栈值,完成时保留1个堆栈值。因此,在lua_call(L, 3, 1)之后,堆栈上只有一个值,因此lua_pop(L, 4)弹出的值太多,超出了内部堆栈,因此崩溃。改为使用lua_pop(L, 1)
如果使用定义的LUA_USE_APICHECK重新构建lua,那么在第一次调用lua_pop(L, 4)时,将从内部断言获得错误消息。

关于c - C在for循环中调用Lua函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31181140/

10-08 21:42