lua_Integer и lua_createtable (ограничение размера таблицы)

В 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;
}

Но, бросок требуется, чтобы заставить замолчать предупреждение:

предупреждение: преобразование в 'int' из 'lua_Integer' может изменить его значение [-Wconversion]

Выполняя поиск по списку рассылки Lua, я обнаружил следующую ветку, посвященную Lua 5.2 (я полагаю, также относится и к более ранним версиям):

Цитата: Роберто Иерусалимский (7 августа 2012 г.)

Размер таблиц уже ограничен 2147483647 элементами. Lua внутренне использует int для индексирования всех своих массивов (кроме строк / байтовых массивов). Трудно везде работать со значениями без знака (например, size_t); У ptrdiff_t нет никаких гарантий вообще.

Это все еще относится к Lua 5.3, которая использует long long за lua_Integer? Является ли актерский состав int от lua_Integer как используется в приведенном выше примере безопасно в Lua 5.3?

1 ответ

Решение

Размер таблицы (количество элементов) по-прежнему ограничен "int". Это не мешает таблице иметь произвольные ключи lua_Integer (если таблица не является правильной последовательностью).

Другие вопросы по тегам