我是否正确地从C函数中将嵌套的lua表作为参数读取?

我将使用C语言实现一个函数,该函数将由Lua脚本调用。

该函数应该接收一个Lua表(甚至包含一个数组)作为参数,因此我应该读取表中的字段。我尝试像下面这样做,但运行时我的函数崩溃了。有人可以帮助我找出问题吗?


//此处是一段C语言代码,用来实现一个被Lua调用的函数
点赞
用户234175
用户234175
int count  = lua_len(L, -1); // 获取 ignoreColor 数组的成员数

int colors[count];
for (int i=0; i<count; i++)
{
    colors[i] = luaL_checkinteger(L, -1-i);
}

这段代码看起来不正确(忽略循环中缺少的比较运算符)。获取表长度的正确函数应该是 lua_objlen。看起来你试图从“ignoreColor”中获取数字,但你并没有先将它们放在堆栈上。结果是 luaL_checkinteger(L, -1-i); 会访问堆栈上错误的索引。

你可能想要类似于以下的代码:

int count  = lua_objlen(L, -1);
std::vector<int> colors(count);
for (int i = 0; i < count; lua_pop(L, 1))
{
  lua_rawgeti(L, 4, ++i);
  colors.push_back( luaL_checkinteger(L, -1) );
}

如果你正在使用 Lua 5.2,则应将 lua_objlen 替换为:

int count  = lua_rawlen(L, -1);

如果从表中移动了很多元素,请确保堆栈中有足够的空间。例如:lua_checkstack

2013-09-05 13:32:01
用户2733013
用户2733013

lua_len并不会返回任何东西,它只会将长度压入堆栈。使用下列代码片段来获取表的长度:

lua_len(L, -1);
int count = luaL_checkinteger(L, -1);
lua_pop(L, 1);
2013-09-05 14:13:55