【问题标题】:lua_Integer and lua_createtable (table size limit)lua_Integer 和 lua_createtable(表大小限制)
【发布时间】:2015-03-09 03:26:49
【问题描述】:

在 Lua 5.3 表相关函数中 C API 接收和返回lua_Integer。

void lua_rawgeti (lua_State *L, int idx, lua_Integer n);
void lua_rawseti (lua_State *L, int idx, lua_Integer n);
lua_Integer luaL_len (lua_State *L, int index);

但是,lua_createtable 仍然收到 int。

void lua_createtable (lua_State *L, int narr, int nrec);

在下面的示例函数中,源表的长度用于创建相同大小的副本。

static int copy_sequence(lua_State *L) {
   lua_Integer len, i;
   luaL_checktype(L, 1, LUA_TTABLE);
   len = luaL_len(L, 1);
   lua_createtable(L, (int)len, 0); /* conversion warning */
   for (i = 1; i <= len; i++) {
      lua_rawgeti(L, 1, i);
      lua_rawseti(L, -2, i);
   }
   return 1;
}

但是,需要强制转换才能使警告静音:

警告:从“lua_Integer”转换为“int”可能会改变其值 [-Wconversion]

在 Lua 邮件列表中搜索,我发现以下 thread 是关于 Lua 5.2(我假设也适用于早期版本):

引用:Roberto Ierusalimschy(2012 年 8 月 7 日)

表格的大小已限制为 2147483647 个元素。卢阿 内部使用“int”来索引它的所有数组(字符串/字节除外 数组)。使用无符号值(例如 size_t)很痛苦 到处; ptrdiff_t 根本没有任何保证。

对于将long long 用于lua_Integer 的Lua 5.3 仍然是这种情况吗?上面示例中使用的从 lua_Integer 转换为 int 在 Lua 5.3 中是否安全?

【问题讨论】:

  • 这个问题似乎更适合 Lua 邮件列表。

标签: c lua lua-api lua-5.3


【解决方案1】:

表格的大小(元素数量)仍然限制为“int”。那 不会阻止表具有任意 lua_Integer 键(只要 因为表格不是正确的顺序)。

【讨论】:

  • 感谢您抽出宝贵时间回答这个问题。当我看到你的回答时,我实际上正在给 lua-l 写一个帖子。
猜你喜欢
  • 2012-03-18
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
  • 1970-01-01
  • 2011-11-21
  • 2019-05-01
相关资源
最近更新 更多