0

ディクショナリテーブルを返すLua関数があり、返されたテーブルに入れられる値の1つは、次のLua関数に示されている別のテーブルです。

function tableWithinTable()
    local ret = {}
    ret["a"] = 1
    ret["b"] = {1,2,3}
    ret["c"] = 3
    return ret
end

その内部テーブルにアクセスするにはどうすればよいですか?

次のifステートメントを入力できるので、テーブルにアクセスできることはわかっています。表を読む私の現在の試みも含まれています。

lua_pushstring("b");
lua_gettable(lua,1);
if(lua_istable(lua,-1))
{
    //whatever is in here is executed.
    lua_pushnumber(lua,1);
    lua_gettable(lua,-1); //crashes to desktop here
    std::cout << lua_tonumber(lua,-1) << std::endl;
    lua_pop(lua,1);
}

これには簡単な解決策があると確信していますが、私は完全に困惑しています。どんな助けでも大歓迎です。

4

2 に答える 2

3

インデックスをプッシュした後、テーブルはスタック内でもう 1 スロット離れています。したがって、次のようなものが機能するはずです。

if(lua_istable(lua,-1)) {
  lua_pushnumber(lua,1);
  lua_gettable(lua,-2);
  ...
于 2012-08-16T03:17:46.643 に答える
0

lua_getfield通常、生の関数よりも関数(文字列インデックスの場合) またはlua_rawgeti(数値インデックスの場合)を使用する方が簡単lua_gettableです。

特に、インデックス作成エラーの原因となるスタック上の余分な値を回避します。

この例は次のように書き換えることができます。

lua_getfield(lua, 1, "b");
if(lua_istable(lua, -1))
{
    lua_rawgeti(lua, -1, 1);
    std::cout << lua_tonumber(lua,-1) << std::endl;
    lua_pop(lua, 1);
}
于 2012-08-16T15:19:52.953 に答える