2012-09-27 46 views
3

我有一个从lua调用的c函数。第一个参数是一个表格。该表被滥用作为输入的数字数组到底层api。所以现在我的代码如下所示:如何获取c中lua表的表长度?

int n = 0; 
lua_pushnil (L); 
while (lua_next (L, 2)) { 
    n++; 
    lua_pop (L, 1); 
} 
int *flat = alloca (n * 4); 
lua_pushnil (L); 
int i = 0; 
while (lua_next(L,2)) { 
    flat[i++] = (int)lua_tonumber(L, -1); 
    lua_pop (L, 1); 
} 

我输入了盲代码,所以请原谅错误。也没有错误检查。但问题是我必须做两次while循环。有没有简单的方法来避免这种情况?我想优化输入是好的情况 - 一个整数表。

+0

通常情况下,我会回答一个问题,谁的答案可以在Lua文档中找到。但考虑到函数名称不明显,并且明显的Google搜索未能找到它,我会让它滑动。 –

+1

对不起,但lua似乎特别难以谷歌。再加上5.1和5.2之间有很多变化。不要误解我的意思,我正在学习很多,但参考手册很难搜索。比如,早些时候,我花了一些时间重新实现luaL_checklong,只是因为我错过了正确的名字。 – starmole

回答

7

您正在寻找的功能是直观的,名称为lua_objlen,或者在Lua 5.2中,lua_len(如果您希望避免元方法调用,则有lua_rawlen)。它有很多作用(虽然有些像字符串的长度,但只要使用lua_tolstring来获取字符串及其长度)并不是很有用,所以你应该熟悉它。

+1

应该注意的是,当表格由非连续整数组成时,这可能不会返回正确的数字 - 请参阅[this](http://stackoverflow.com/questions/652957/how-do-i-get-the-密钥的数量在一个哈希表中的lua)和[这个](http://stackoverflow.com/questions/2705793/how-to-get-number-of-entries-in-a -lua-表)。 – mtsvetkov

+0

实际上,只要表格由连续的事物组成,而不是零,不仅是整数。在Lua中[这被称为'序列'](http://www.lua.org/manual/5.2/manual.html#3.4.6)。请注意,在Lua 5.1中,定义略有不同,但Lua 5.2的定义更简单。还请注意,在Lua 5.2中,lua_objlen已被重命名为[lua_rawlen](http://www.lua.org/manual/5.2/manual.html#lua_rawlen),并且不尊重__len元方法。 – catwell

+0

感谢您的5.2更新。我应该提到我正在使用5.2。 – starmole