簡體   English   中英

在c ++函數中使用lua_call很多次

[英]Using lua_call a lot of times in c++ function

首先,我很抱歉我的英語。

我的問題是如何在C ++函數中多次使用lua_call。 我有一個程序使用lua作為主要語言,但它接受c ++插件來添加功能。 我想從c ++調用LUA函數,並在LUA Runtime中調用該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_call但是然后清除LUA堆,函數dissapear和第二個lua_call嘗試使用第一個調用的返回布爾值而不是函數。

我想要這樣的東西:

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

在LUA:

function ShowProgress(actual, final)
    local percent = (actual/final)*100;

    Dialog.Message("Working", "I'm in "..actual.." from "..final.." ("..percent.."%)");

    return true;
end

筆記:

Dialog.Message是我用來顯示消息的程序的一個功能。 就像MessageBox(NULL,Text,Title,MB_OK); 在c ++中。

IRLUA_PLUGIN_CheckBoolean是插件SDK的一個函數,它檢查參數是否為booleand並返回其值,否則返回錯誤。

我可以用lua_getfield(L,LUA_GLOBALSINDEX,“FunctionName”)來做到這一點; ,但不是我想要的。

有人知道怎么做嗎?

你已經很好地理解了這個問題。 這是你如何解決它。

在第一個示例中, lua_call從堆棧中彈出函數,因此您需要先復制它。 此外,函數返回的布爾值是無用的,因此您需要彈出它或者不要通過將最后一個參數設置為0來要求它為lua_call:

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

(我已經修復了你的代碼的一些其他問題:傳遞的第二個數字應該是total ,而不是j ,你不想使用continue作為變量名......)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM