如何从C函数返回多维表到Lua?

我需要像这样使用 Lua 返回一个表:

{
    [0] = { ["field1"] = "1", ["field2"] = "2" , ["field3"] = "3" },
    [1] = { ["field1"] = "10" , ["field2"] = "20", ["field3"] = "30" }
}

但是从 C 的角度和使用 lua_* 函数的角度来看,0 和 1 只是一个示例,它可能包含更多类似的数组。有谁能帮帮我吗?

点赞
用户1150918
用户1150918

使用lua_createtable()lua_pushnumber()lua_setfield()lua_settable()的简单示例。

我假设你正在编写某种包装器。 不过,仍然基本相同。

/* 在Lua VM堆栈顶部推送多维表。 */
int
l_push_multidim_table(lua_State *L)
{
    /* 创建大小为2个数组元素的父表:*/
    lua_createtable(L, 2, 0);

    /* 将第一个子表的键推到Lua VM堆栈的顶部:*/
    lua_pushnumber(L, 1);

    /* 创建大小为3个非数组元素的第一个子表:*/
    lua_createtable(L, 0, 3);

    /* 填充第一个子表:*/
    lua_pushnumber(L, 1);
    lua_setfield(L, -2, "field1");

    lua_pushnumber(L, 2);
    /* setfield()从Lua VM堆栈中弹出值。 */
    lua_setfield(L, -2, "field2");

    lua_pushnumber(L, 3);
    lua_setfield(L, -2, "field3");

    /* 请记住,子表位于堆栈的顶部。
     * lua_settable()弹出键值对。 */
    lua_settable(L, -3);

    /* 推送第二个子表的键值:*/
    lua_pushnumber(L, 2);

    /* 创建大小为3个非数组元素的第二个子表:*/
    lua_createtable(L, 0, 3);

    /* 填充第二个子表:*/
    lua_pushnumber(L, 10);
    lua_setfield(L, -2, "field1");

    lua_pushnumber(L, 20);
    lua_setfield(L, -2, "field2");

    lua_pushnumber(L, 30);
    lua_setfield(L, -2, "field3");

    /* 请记住,子表仍位于栈顶。
     * lua_settable从Lua VM堆栈中弹出键值对,
     * 并将子表放入父表。 */
    lua_settable(L, -3);

    /* 返回输出表的数量:
     * (1多维的)*/
    return 1;
}

注意:在Lua中,数组值通常从1开始。 因此,我按照这种方式更改了您的示例结构。 总之,它应该有效。

2013-11-24 13:05:37