Lua 5.3 では、C API のテーブル関連の関数は receive と returnlua_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メーリングリストで検索すると、Lua 5.2に関する次のスレッドが見つかりました(以前のバージョンにも当てはまると思います):
引用: Roberto Ierusalimschy (2012 年 8 月 7 日)
テーブルのサイズはすでに 2147483647 要素に制限されています。Lua は内部的に 'int' を使用してすべての配列にインデックスを付けます (文字列/バイト配列を除く)。どこでも符号なしの値 (size_t など) を扱うのは面倒です。ptrdiff_t には何の保証もありません。
long long
これは、 forを使用する Lua 5.3 にも当てはまりlua_Integer
ますか? int
上記の例で使用されているfromへのキャストはlua_Integer
、Lua 5.3 で安全ですか?