我与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);
}
答案 0 :(得分:1)
CFunction
的参数按照提供的顺序被按到虚拟堆栈上,在操作这些值之前,您只需要进行错误检查。
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