在 for 循环中调用 Lua 函数。

我的 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<=10" 一样更改循环条件,则可以正常工作。如何解决这个问题?

点赞
用户107090
用户107090

lua_call(L, 3, 1) 在执行完之后会消耗3个栈值并且只剩下1个栈值。因此,在执行完 lua_call(L, 3, 1) 之后,栈上只有一个值,所以 lua_pop(L, 4) 弹出的值太多,超出了内部栈的范围,因此导致了崩溃。应改为使用 lua_pop(L, 1)

如果您在重新构建Lua时定义了 LUA_USE_APICHECK,那么在第一次调用 lua_pop(L, 4) 时,您将会得到一个来自内部断言的错误消息。

2015-07-02 10:12:38