在迭代之前请求c中的lua表大小

时间:2011-01-27 11:12:08

标签: c lua

这应该很简单,它可能是,但在我的C代码中,我想在开始迭代之前知道表的大小。我需要预先分配一些内存来存储来自该表的值。

我将此表作为lua c函数中的参数。

static int lua_FloatArray(lua_State *L)
{
 int n = lua_gettop(L);
 if (n != 1 || lua_gettype(L, 1) != LUA_TTABLE)
 {
  luaL_error(L, "FloatArray expects first parameter to be a table");
  return 0;
 }
 int tablesize = ????;
 float *a = (float*)lua_newuserdata(L, tablesize * sizeof(float));
 lua_pushnil(L);
 int x = 0;
 while (lua_next(L, index) != 0)
 {
  a[x++] = (float)lua_tonumber(L, -1);
  lua_pop(L, 1); // Remove value, but keep key for next iteration
 }
 return 1;
}

tablesize?如何获得表格?

3 个答案:

答案 0 :(得分:6)

假设您正在使用数组 - 具有整数键的表,没有 hole (某些键 nil ) - 您可以使用lua_objlen方法。引自手册:

  

返回给定可接受索引处的值的“长度”:对于字符串,这是字符串长度;对于表,这是长度运算符('#');

的结果

答案 1 :(得分:4)

没有这样的API功能。你需要自己计算物品。 另一方面,你似乎在C中填充一个数组,我猜你有一个像{10,20,30}这样的Lua表,你假设你将按照我列出的顺序得到这些项目。对于lua_next不是。请参阅http://www.lua.org/manual/5.1/manual.html#pdf-next中的第二段。

答案 2 :(得分:0)

我不知道这实际上是不是很好的编程习惯,但我经常以结构的形式使用2d数组/表

为数组提供ptr字段(或指向指针数组的指针),以及列数和行数字段。