【问题标题】:C calling Lua function in a for loopC在for循环中调用Lua函数
【发布时间】:2015-07-02 09:44:01
【问题描述】:

我的 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

【问题讨论】:

    标签: c loops lua


    【解决方案1】:

    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) 时收到来自内部断言的错误消息。

    【讨论】:

    • 顺便说一句,有没有办法缓存“lua_sum”函数,而不是在循环体中使用lua_getglobal(L,“lua_sum”),所以我只能加载一次Lua函数。
    • @user1021531,是的,在循环外调用lua_getglobal,在正文中调用lua_pushvalue(L,-1)
    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多