2012-09-27 87 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