gpt4 book ai didi

c++ - 将 Lua 函数传递给 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:47:40 26 4
gpt4 key购买 nike

我正在用 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 引用手册,但没有成功。

我认为我正在寻找的修复程序很简单,希望您能提供帮助。

感谢阅读

最佳答案

lua_close(L)调用过早,破坏了lua栈。

关于c++ - 将 Lua 函数传递给 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35287476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com