C++ 在c++;功能
首先,我为我的英语感到抱歉 我的问题是如何在C++函数中使用LuaIAube不止一次。我有一个程序,使用Lua作为主要语言,但它接受C++插件来添加功能。我想从C++调用一个LUA函数,并调用Lua运行时的C++函数。 我想写一个C++函数,在工作的时候有一个进步,然后把这个进程传递给一个LUA函数,它负责向用户展示进度。 现在我在LUA中有一个测试函数:C++ 在c++;功能,c++,lua,C++,Lua,首先,我为我的英语感到抱歉 我的问题是如何在C++函数中使用LuaIAube不止一次。我有一个程序,使用Lua作为主要语言,但它接受C++插件来添加功能。我想从C++调用一个LUA函数,并调用Lua运行时的C++函数。 我想写一个C++函数,在工作的时候有一个进步,然后把这个进程传递给一个LUA函数,它负责向用户展示进度。 现在我在LUA中有一个测试函数: function ShowText(text) Dialog.Message("Hi", text); return tru
function ShowText(text)
Dialog.Message("Hi", text);
return true;
end
和C++函数:
static int Test(lua_State *L){
lua_pushstring(L, "Hi There");
lua_call(L, 1, 1);
lua_pushstring(L, "Again");
lua_call(L, 1, 1);
return 0;
}
然后我使用以下命令从LUA调用此函数:
Test.Test(ShowText);
第一次lua_调用都可以正常工作,但随后lua堆被清除,函数dissapear和第二次lua_调用尝试使用第一次调用的返回布尔值代替函数
我想要这样的东西:
static int Test(lua_State *L){
int total = 10;
for (int j; j<total; j++){
lua_pushnumber(L, j);
lua_pushnumber(L, j);
lua_call(L, 2, 1);
bool continue = IRLUA_PLUGIN_CheckBoolean(L, -1);
lua_pop(L, 1); //Delete the last boolean
if (continue == false){
break;
}
}
return 0;
}
注:
对话框。消息是我用来显示消息的程序的一个功能。类似于MessageBox(空、文本、标题、MB_OK)
IRLUA\u PLUGIN\u CheckBoolean是PLUGIN SDK的一个函数,用于检查参数是否为布尔值并返回其值,如果不是,则返回错误
我可以使用lua_getfield(L,lua_GLOBALSINDEX,“FunctionName”),但这不是我想要的
有人知道怎么做吗?你很了解这个问题。下面是您如何修复它的 在第一个示例中,
lua_call
从堆栈中弹出函数,因此需要首先复制它。此外,该函数返回的布尔值是无用的,因此您需要通过将最后一个参数设置为0来弹出它,或者不要求它调用lua_:
static int Test(lua_State *L) {
lua_pushvalue(L, 1); /* duplicate function */
lua_pushstring(L, "Hi There");
lua_call(L, 1, 0);
lua_pushstring(L, "Again");
lua_call(L, 1, 0);
return 0;
}
现在将其应用于第二个示例:
static int Test(lua_State *L) {
int total = 10;
for (int j = 0; j<total; j++) {
lua_pushvalue(L, 1); /* duplicate function */
lua_pushnumber(L, j);
lua_pushnumber(L, total);
lua_call(L, 2, 1);
bool keep_going = IRLUA_PLUGIN_CheckBoolean(L, -1);
lua_pop(L, 1); /* pop the boolean */
if (keep_going == false) {
break;
}
}
return 0;
}
静态int测试(lua_State*L){
整数合计=10;
对于(int j=0;jThanks for all;)我会做一些测试,但应该可以。你是对的,我想再次通过total而不是j,并继续作为变量…太糟糕了。再次感谢!!
static int Test(lua_State *L) {
int total = 10;
for (int j = 0; j<total; j++) {
lua_pushvalue(L, 1); /* duplicate function */
lua_pushnumber(L, j);
lua_pushnumber(L, total);
lua_call(L, 2, 1);
bool keep_going = IRLUA_PLUGIN_CheckBoolean(L, -1);
lua_pop(L, 1); /* pop the boolean */
if (keep_going == false) {
break;
}
}
return 0;
}