我正在使用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参考手册,但没有成功。
我相信我正在寻找的修复是微不足道的,我希望你可以提供帮助。
感谢您阅读
答案 0 :(得分:0)
lua_close(L)被叫得太早了,它摧毁了lua堆栈。