[英]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 ++,而且还buttonId
了buttonId
。
我不知道参数偏移是否引起了问题。
引用Lua函数的整数是3。
我曾尝试研究Lua参考手册,但未成功。
我相信我正在寻找的解决方法很简单,希望您能提供帮助。
感谢您的阅读
lua_close(L)被调用为时过早,这破坏了lua堆栈。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.