繁体   English   中英

将Lua函数传递给C ++

[英]Passing Lua function to C++

我正在用C ++制作GUI。

我希望Lua脚本在C ++中注册Lua函数,以便当C ++处理按钮单击时,C ++会调用已注册的Lua函数。

我已将以下SO帖子用作指南: http : //stackoverflow.com/questions/4928973/how-do-you-pass-a-lua-function-to-ac-function-and-execute-the-lua -功能-塞弗

由于某种原因,由于我的更改,它不起作用。

这是我的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 ++,而且还buttonIdbuttonId

我不知道参数偏移是否引起了问题。

引用Lua函数的整数是3。

我曾尝试研究Lua参考手册,但未成功。

我相信我正在寻找的解决方法很简单,希望您能提供帮助。

感谢您的阅读

lua_close(L)被调用为时过早,这破坏了lua堆栈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM