Форум: "Игры";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизОрех какой-то :) Найти похожие ветки
← →
Kobik. (2006-09-11 18:44) [0]Выкладываю не в рассчете, что поможете, а просто для прикола.
Есть статичный массив с юнитамиHarUn:array[1..kol_max_players,1..kol_max_units]of THarUn;
При запуске массив обнуляем.
Есть процедура, которая создает нового юнита (например при выпуске из казармы)
Ошибка возникает после поиска свободного места в массиве (считается, что если у юнита <=0 жизни, то его уже нет и на его место можно пихнуть другого)num:=1;
while(harUn[player,num].health>0)and(num<=kol_max_units)do inc(num);
Предположительно num становится больше kol_max_units (!!! это уже при первом вызове, когда свободных мест должно быть дополна !!!).
А самый прикол в том, почему я говорю "предположительно", а не наверняка:
Если дальше добавить строчкуlog_write("Номер нового юнита"+inttostr(i));
(просто добавляет строку в текстовый файл log.txt)
то никаких ошибок не возникает :)
Если ставлю BreakPoint в делфи, то тоже все нормально...
← →
a22 © (2006-09-11 18:50) [1]я много раз сталкивался с такими вещами и практически каждый раз вина была на самом программисте, а не на среде разработки или каких-то библиотеках. ищи. может, у тебя треды какие-нибудь с переменными работают.. мало ли, по такому описанию выводы делать тяжело
← →
Kobik. (2006-09-11 19:00) [2]Да не, я итак уверен что это я накосячил, но все равно веселая вещь.
Кстати, можешь рассказать примерно от чего у тебя были такие косяки? А то я пока даже не знаю за что зацепиться...
← →
XProger © (2006-09-11 20:16) [3]Массив - 2D, обращаешься с ним как с 1D. Уже подозрительно... THarUn - что такое вообще?
← →
Cash © (2006-09-11 20:49) [4]THarUn - это что? Запись или еще чего недоброго?
← →
VolanD666 (2006-09-12 14:19) [5]А я думал, что для хранения всяких юнитов используют списки?
← →
Думкин © (2006-09-12 14:27) [6]
> harUn[player,num].health>0)and(num<=kol_max_units
Тут всяко условия надо переменить местами и проверить как проверяются булевы условия.
← →
@!!ex © (2006-09-12 15:57) [7]
try
except
log_write("Номер нового юнита"+inttostr(i));
end;
← →
Kobik. (2006-09-12 16:40) [8]Ошибку нашел... Конечно совсем в другом месте, портилось health у мертвых юнитов.
И все же веселый штука. Если записываешь health в лог файл, то он -854723400 и соответственно меньше нуля (все работает). Если не записываешь, то больше нуля =))))
>Думкин © (12.09.06 14:27) [6]
мда, тут я ошибся...
>XProger © (11.09.06 20:16) [3]
>Массив - 2D, обращаешься с ним как с 1D. Уже подозрительно...
что-то ты путаешь, обращаюсь я к нему как к двумерному (может тебе вместо , показалась . ??)
А вообще конечно, массив тут не уместен, надо будет переделать...
ЗЫ. Тип THarUn - запись, а разве это плохо?
← →
Cash © (2006-09-12 20:16) [9]
(harUn[player,num].health>0)and(num<=kol_max_units)
А нас учили ваще так не делать. Здесь на лицо нарушение обращения
к памяти. Конструкция семантически не верна.
Я бы решил эту дилемму так:while num <= kol_max_units do begin
if harUn[player,num].health <= 0 then break;
inc(num);
end;
Здесь AV не вылетит, а по сложности и накладности эта конструкция
даже легче, вроде.
>ЗЫ. Тип THarUn - запись, а разве это плохо?
Нет, мога быть даже хорошо.
А еще, Kobik., там, где у юнитов жизнь становится <= 0, сделай жесткое
ограничение, мол меньше чем -1 быть не может, и это решит еще одну
возможную проблему.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.051 c