将Lua函数传递给C ++

时间:2016-02-09 08:47:43

标签: c++ lua

我正在使用C ++制作GUI。

我想要一个Lua脚本用C ++注册一个Lua函数,这样当C ++处理按钮点击时,C ++将调用一个注册的Lua函数。

我使用了以下SO帖子作为指南:http://stackoverflow.com/questions/4928973/how-do-you-pass-a-lua-function-to-a-c-function-and-execute-the-lua-function-seve

由于某些原因,我的更改无效。

这是我的Lua代码:

-- this is button.setClickEvent
function self.setClickEvent(eventFunction)
    uiButtonSetClickEvent(self.id, eventFunction)
end
function buttonClick()
    print("yay it worked!")
end

button.setClickEvent(buttonClick)

这是C ++代码

static int lua_uiButtonSetClickEvent(lua_State *L)
{
    int argumentsCount = lua_gettop(L);
    int argumentsMin = 2;
    if(argumentsCount < argumentsMin)
        cout << "Error at uiButtonSetClickEvent, incorrect number of arguments" << endl;

    double buttonId = lua_tonumber(L, 1);
    int event = luaL_ref(L, LUA_REGISTRYINDEX);

    long i = uiButtonGetIndex(buttonId);
    if(i != -1)
    {
        cout << "!!! Storing lua function reference" << endl;
        uiButtons[i].luaClickEvent = event;
        uiButtonSetClickEvent(buttonId, lua_uiButtonCallClickEvent);
    }

    return 0;
}

static void uiButtonSetClickEvent(double buttonId, void (&event)(double))
{
    long i = uiButtonGetIndex(buttonId);
    if(i != -1)
        uiButtons[i].clickEvent = event;
}

static void lua_uiButtonCallClickEvent(double buttonId)
{
    long i = uiButtonGetIndex(buttonId);
    if(i != -1)
    {
          lua_rawgeti( L, LUA_REGISTRYINDEX, uiButtons[i].luaClickEvent);

          if ( 0 != lua_pcall( L, 0, 0, 0 ) ) {
            printf("Failed to call the callback!\n %s\n", lua_tostring(L, -1));
            return;
          }

          uiButtons[i].luaClickEvent = luaL_ref(L, LUA_REGISTRYINDEX);
    }
}

一切都按预期发生,直到

结果是lua_uiButtonCallClickEvent位于以下行的分段错误:

lua_rawgeti( L, LUA_REGISTRYINDEX, uiButtons[i].luaClickEvent);

我在SO和我的实现指南之间注意到的唯一区别是,不仅将Lua函数传递给C ++,还传递buttonId

我不知道参数偏移是否导致问题。

引用Lua函数的整数是3。

我尝试过研究Lua参考手册,但没有成功。

我相信我正在寻找的修复是微不足道的,我希望你可以提供帮助。

感谢您阅读

1 个答案:

答案 0 :(得分:0)

lua_close(L)被叫得太早了,它摧毁了lua堆栈。