4

私は lua と C との対話の基本を知っており、現在 c++ で lua の次の行を実行しようとしています。

Func1():Func2().Table1.value1

「value2」の値を取得して、C プログラムで使用しようとしています。以下は、C でこの値を取得するために私が書いたコードです。

int GetNumber()
{
    int retn = 0;
    g_clientlua.lua_getfield(LUA_REGISTRYINDEX, "Player");
    g_clientlua.lua_getfield(-1, "Func2");
    g_clientlua.lua_getfield(LUA_GLOBALSINDEX, "Func1");
    g_clientlua.lua_call(0, 1);
    g_clientlua.lua_call(1, 1);
    if (g_clientlua.lua_isnil(-1)) 
        return retn;
    g_clientlua.lua_getfield(-1, "Table1");
    if (g_clientlua.lua_isnil(-1)) 
        return retn;
    g_clientlua.lua_getfield(-1, "value1");
    if (g_clientlua.lua_isnil(-1)) 
        return retn;
    retn = (int)g_clientlua.lua_tointeger(-1);
}

clientlua は、基本的に lua_* 関数と同等のメソッドを呼び出し、lua_state ポインター パラメーターを lua 状態へのポインターであるメンバー変数で満たすメソッドを呼び出すことを可能にするオブジェクトです。

これを呼び出すたびに、lua スタック リークを引き起こしていると不平を言います。これを解決するためlua_pop(3)に、最後に a を追加しようとしましたが、エラーを報告せずにプログラムがクラッシュするだけなので、何か間違ったことをしていると思います。

誰かが私に何か知恵の言葉を持っていますか? ここでちょっと負けました。上記のコードが適切に記述されているとは思えませんが、上記の lua 呼び出しを C でどのように記述すればよいでしょうか?

4

2 に答える 2

2

(グローバル テーブルからではなく) 返されるテーブルからFunc1取得する前に、呼び出す必要があります。Func2Func2Func1

次に、その戻り値などを呼び出しFunc2て検索する必要があります。Table1

どのような「スタック リーク」の苦情を受けていますか? この関数を C から直接呼び出している場合は、そうです。lua スタックに置いたもの (呼び出し元が消費するものではないもの) は、戻る前に必ず lua スタックからポップする必要があります。

于 2013-07-16T05:57:38.017 に答える