1

Lua から呼び出される C/C++ 関数を作成しています。私の関数は、署名が次のようなライブラリ関数を呼び出す必要があります。

void libFunction( int val1, int val2, tSETTINGS * pSettings );

これらの C/C++ 構造体が与えられます。

typedef struct
{
    int cmd;
    int arg;
} tCOMMAND;
typedef struct
{
    int numberCommands;
    int id;
    tCOMMAND commands[1];
} tSETTINGS;

私の考えは間違っているかもしれませんが、Lua から次のように呼び出しています。

id   = 42
val1 = 1
val2 = 2
cmd1 = { 3, 4 }
cmd2 = { 5, 6 }
commands = { cmd1, cmd2 }
settings = { #commands, id, commands }
mycfunction( val1, val2, settings )

私がしようとしていることがうまくいかないので、C++ から参照される Lua スタックをまだ理解していないと確信しています。私のソリューションはval1val2#commandsおよびを取得できますが、id取得しようとすると、それぞれcommands[0]およびcommands[1]が取得されます。{1, 2}{2, 42}

私の C++ は基本的にこのようなものです (このサンプルでは、​​値を破棄しています)。私はすでに取得val1しましたval2

int stkNdx = 1;
lua_rawgeti(L, 3, stkNdx++ );
int numcmds = lua_tointeger(L, -1);  // this successfully retrieves numberCommands 2
lua_pop(L, 1);
lua_rawgeti(L, 3, stkNdx++ );
int id = lua_tointeger(L, -1);       // this successfully retrieves id 42
lua_pop(L, 1);

lua_pushvalue(L, -1 );
lua_pushnil(L);
int cmdNbr = 0;
for( lua_next(L, -2); cmdNbr < numcmds; cmdNbr++ )
{
    lua_pushvalue(L, -2);
    int cmd = lua_tointeger(L, -1);
    int arg = lua_tointeger(L, -1);
    lua_pop(L, 2);
    lua_next(L, -2);
}
lua_pop(L, 1);

基本的に同じ結果で、 とがlua_rawgeti()続くのさまざまな順列を試しました。lua_tonumber()lua_pop()

これはこの質問に似ているようで、私のソリューションはその後モデル化されていますが、成功していません。

さらに実験して、これを挿入しました:

lua_pushnil(L);
while( lua_next(L, -2) )
{
    if( ! lua_istable(L, -1) )
    {
        int v = lua_tointeger(L, -1);
    }
    lua_pop(L, 1);
}

このループは 4 回実行されます。最初の 2 回の値 2 と 42 が に割り当てられvます。次の 2 回の反復では割り当てがスキップされます (lua_istable は true を返しました)。だから、私はすでに と を取得numcmdsしましidたが、それらはまだスタックに残っているようです。また、サブテーブルが発生したときにサブテーブルを反復処理する方法も明らかにわかりません。

4

1 に答える 1