Get Lua table size in C
如何在C中获取Lua表的大小?
1 2 3 4 5 6 7 8 9
| static int lstage_build_polling_table (lua_State * L ) {
lua_settop (L , 1);
luaL_checktype (L , 1, LUA_TTABLE );
lua_objlen (L ,1);
int len = lua_tointeger (L ,1);
printf("%d\
",len );
...
} |
我的Lua代码:
1 2 3 4 5 6
| local stages = {}
stages[1] = stage1
stages[2] = stage2
stages[3] = stage3
lstage.buildpollingtable(stages) |
它总是打印0。 我究竟做错了什么?
-
"表的大小"是一个奇怪的术语。 如果表具有手册中定义的序列,则将获得表中序列的长度(可能为0),否则不
lua_objlen返回对象的长度,它不将任何内容压入堆栈。
即使它确实将某些内容压入堆栈,您的lua_tointeger调用也会使用表的索引,而不使用lua_objlen会压入堆栈的内容(如果它首先压入任何内容,则不会)。
您想要Lua 5.1的size_t len = lua_objlen(L,1);。
或size_t len = lua_rawlen(L,1);用于lua 5.2。
-
实际上,类型是size_t。 另外,由于Lua 5.2的名称为lua_rawlen:lua.org/manual/5.2/manual.html#lua_rawlen
-
真棒! 谢谢@伊坦!
-
注意:这些方法仅适用于"列表",即具有[1 ..]连续索引的lua表。 在stackoverflow.com/questions/2705793/上讨论的详细信息
在您提供的代码中,只需将lua_objlen(L,1)替换为lua_len(L,1)。
lua_objlen和lua_rawlen返回长度,不要将其留在堆栈中。
lua_len不返回任何内容,并将长度留在堆栈上; 它也尊重元方法。
-
注意:这些方法仅适用于"列表",即具有[1 ..]连续索引的lua表。 在stackoverflow.com/questions/2705793/上讨论的详细信息