表作为从Lua调用的C函数中的参数

时间:2016-10-19 15:53:56

标签: c++ c lua

我与Lua打交道的时间较长,但有一点我无法实现。 在从Lua调用的C函数中,我能够使用如下的表名读取全局Lua表:

C:

    // get table
    lua_getglobal(L, "tableName");
    if (!lua_istable(L, -1))                
       break;            

    // count entries in table
    ULONG numEntries = 0; 
    lua_pushnil(L);
    while(lua_next(L,-2))
    {
        numEntries++;
        lua_pop(L, 1);
    }

但如果我有一个lua函数调用这样的C函数:

的Lua:

   luaTable = { }
   luaTable.Param1 = Value1 
   luaCallC("This is a Text", luaTable)

如何访问表参数?

C:

    // get table
    // ???

    // count entries in table
    ULONG numEntries = 0; 
    lua_pushnil(L);
    while(lua_next(L,-2))
    {
        numEntries++;
        lua_pop(L, 1);
    }

1 个答案:

答案 0 :(得分:1)

CFunction的参数按照提供的顺序被按到虚拟堆栈上,在操作这些值之前,您只需要进行错误检查。

Lua 5.3 Manual §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