从C ++访问表中的Lua表

时间:2012-08-15 18:18:28

标签: c++ lua

我有一个Lua函数返回一个字典表,其中一个放入返回表的值是另一个表,如下面的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);
}

我很确定这有一个简单的解决方案,但我完全难过了。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

在推送索引之后,表格在堆栈中的另一个位置。所以这样的事情应该有效:

if(lua_istable(lua,-1)) {
  lua_pushnumber(lua,1);
  lua_gettable(lua,-2);
  ...

答案 1 :(得分: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);
}