Не совсем понятно зачем тут Iter_Free. У тебя ведь итератор имеет тот же размер, что и массив с домами, а значит логично просто проверить количество возвращённых строк, дабы получить тот же эффект, но без постоянного насилования Iter_Free (который, к слову, содержит в себе цикл). Да и не совсем понятен смысл поля "id", если у тебя есть итератор, который отлично сортирует данные.
И не стоит использовать cache_num_rows, если ты записываешь значение в массив :) Этим ты вдвойне насилуешь стэк, ибо cache_num_rows является обычным stock, в котором создаётся переменная и вызывается cache_get_row_count.
Я бы сделал так:
Поле id оставил бы в виде "AUTO_INCREMENT" и не трогал бы его. Пусть этот столбец будет нужен исключительно MySQL. А для ID домов на сервере я создал бы ещё один столбец (например, "house_id") и контролировал бы его уже сам.
Зачем это нужно? Во-первых, это позволит быть уверенным в том, что твой запрос на выгрузку данных вернёт ровно столько строк, сколько есть ячеек
(если ты, конечно, не уменьшишь число ячеек в один момент, указав меньшее число, чем будет домов на сервере). Во-вторых, это позволит использовать этот ID в качестве индекса массива, тем самым ты сможешь обращаться к базе с домами, не обращаясь, при этом, к массиву, дабы получить ID дома, так как он будет равен индексу. Возможно, не очень понятно, так что покажу пример загрузки.
new Iterator:House<MAX_HOUSES>;
public LoadHouses()
{
new row_count;
cache_get_row_count(row_count);
if(row_count > MAX_HOUSES)// Проверка нужна как раз на случай, если ты решишь изменить значение MAX_HOUSES и укажешь его меньше, чем есть домов в базе
{
row_count = MAX_HOUSES;
print("Warning: Тут сообщение с предупреждением о том, что часть домов не загрузилось"); }
for (new i, idx; i < rows; i++)
{
cache_get_value_name_int(i, "house_id", idx);// Выгружаем ID дома
cache_get_value_name_float(i, "x", hInfo[idx][house_Y]);// И тут уже используем значение "idx" в качестве индекса
cache_get_value_name_float(i, "y", hInfo[idx][house_Y]);
cache_get_value_name_float(i, "z", hInfo[idx][house_Z]);
// ...
Iter_Add(House, idx);// + заносим индекс в итератор
}
printf("Загружено %d домов", row_count
); return 1;
}
А при создании дома уже используем Iter_Free, тем самым сразу проверяя лимит домов и определяя свободный ID для базы
new id = Iter_Free(House);
if(id == INVALID_ITERATOR_SLOT)
{
return 1;
}
format(....
, "INSERT INTO house(house_id,...)VALUE(%d,....)", id
);// Указываем значение Iter_Free в качестве значения "house_id" // ...
Iter_Add(House, id);