C在for循环中调用Lua函数

时间:2015-07-02 09:44:02

标签: c loops 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编译的。当运行此代码时,它会导致错误,只是停止代码,但没有消息,如果我更改循环子句,如&# 34; i&lt; = 10&#34;,它运行正常,如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

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)时,您将从内部声明中收到错误消息。