C 函数中作为参数使用的 Lua 表格

我已经使用Lua一段时间了,但有一点我无法实现。 在从Lua调用的C函数中,我可以使用表名读取全局Lua表:

C:

    // 获取表格
    lua_getglobal(L, "tableName");
    if (!lua_istable(L, -1))
       break;

    // 计算表中的条目数量
    ULONG numEntries = 0;
    lua_pushnil(L);
    while(lua_next(L,-2))
    {
        numEntries++;
        lua_pop(L, 1);
    }

但是如果我有一个调用C函数的Lua函数,例如:

Lua:

   luaTable = { }
   luaTable.Param1 = Value1
   luaCallC("这是一个文本", luaTable)

我如何访问表参数?

C:

    // 获取表格
    // ???

    // 计算表中的条目数量
    ULONG numEntries = 0;
    lua_pushnil(L);
    while(lua_next(L,-2))
    {
        numEntries++;
        lua_pop(L, 1);
    }
点赞
用户2505965
用户2505965

CFunction 中,参数按照提供顺序压入虚拟栈中,您需要在操作这些值之前进行所需的错误检查。

Lua 5.3 手册 §4.8 - lua_CFunction:

为了正确地与 Lua 通信,C 函数必须使用以下协议,这定义了参数和结果传递的方式:C 函数按照直接顺序从 Lua 中的栈中接收其参数(第一个参数首先被推送)。

[ ... ]

第一个参数(如果有)在索引1处,最后一个参数在索引lua_gettop(L)处。将结果返回给 Lua,C 函数只需要按照直接顺序将它们推入堆栈中(第一个结果首先推送),并返回结果数量。

下面是一个详细检查表元素数量的示例,使用任意第一个参数。

int count (lua_State *L) {
    luaL_checktype(L, 2, LUA_TTABLE);

    puts(lua_tostring(L, 1));

    size_t ec = 0;

    lua_pushnil(L);

    while (lua_next(L, 2)) {
        lua_pop(L, 1);
        ec++;
    }

    lua_pushinteger(L, (lua_Integer) ec);
    return 1;
}

在 Lua 中注册此功能后:

count('foo', { 'a', 'b', 'c' }) -- 3
2016-10-19 19:26:10