Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c++;功能_C++_Lua - Fatal编程技术网

C++ 在c++;功能

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

首先,我为我的英语感到抱歉

我的问题是如何在C++函数中使用LuaIAube不止一次。我有一个程序,使用Lua作为主要语言,但它接受C++插件来添加功能。我想从C++调用一个LUA函数,并调用Lua运行时的C++函数。 我想写一个C++函数,在工作的时候有一个进步,然后把这个进程传递给一个LUA函数,它负责向用户展示进度。 现在我在LUA中有一个测试函数:

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;
}