6

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 で安全ですか?

4

1 に答える 1