【问题标题】:Table as parameter in C function called from Lua表作为从 Lua 调用的 C 函数中的参数
【发布时间】:2016-10-20 03:32:19
【问题描述】:

我与 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);
    }

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

Lua:

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

如何访问 table 参数?

C:

    // get table
    // ???

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

【问题讨论】:

  • 它在堆栈上。请阅读manual,因为堆栈是 C API 工作方式的基础。 Programming in Lua 有使用示例。

标签: c++ c lua


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2015-06-15
    • 2015-05-15
    • 1970-01-01
    • 2013-02-13
    • 2014-09-11
    • 2016-08-19
    相关资源
    最近更新 更多