![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Орех какой-то :)
Kobik. © (2006-09-11 18:44:00)Выкладываю не в рассчете, что поможете, а просто для прикола.
Есть статичный массив с юнитами
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 в делфи, то тоже все нормально...
Cash (2006-09-12 20:16:00) [1]
(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 быть не может, и это решит еще одну
возможную проблему.
Kobik. (2006-09-12 16:40:00) [2]Ошибку нашел... Конечно совсем в другом месте, портилось health у мертвых юнитов.
И все же веселый штука. Если записываешь health в лог файл, то он -854723400 и соответственно меньше нуля (все работает). Если не записываешь, то больше нуля =))))
>Думкин © (12.09.06 14:27) [6]
мда, тут я ошибся...
>XProger © (11.09.06 20:16) [3]
>Массив - 2D, обращаешься с ним как с 1D. Уже подозрительно...
что-то ты путаешь, обращаюсь я к нему как к двумерному (может тебе вместо , показалась . ??)
А вообще конечно, массив тут не уместен, надо будет переделать...
ЗЫ. Тип THarUn - запись, а разве это плохо?
@!!ex (2006-09-12 15:57:00) [3]
try
except
log_write('Номер нового юнита'+inttostr(i));
end;
Думкин (2006-09-12 14:27:00) [4]
> harUn[player,num].health>0)and(num<=kol_max_units
Тут всяко условия надо переменить местами и проверить как проверяются булевы условия.
VolanD666 (2006-09-12 14:19:00) [5]А я думал, что для хранения всяких юнитов используют списки?
Cash (2006-09-11 20:49:00) [6]THarUn - это что? Запись или еще чего недоброго?
XProger (2006-09-11 20:16:00) [7]Массив - 2D, обращаешься с ним как с 1D. Уже подозрительно... THarUn - что такое вообще?
Kobik. (2006-09-11 19:00:00) [8]Да не, я итак уверен что это я накосячил, но все равно веселая вещь.
Кстати, можешь рассказать примерно от чего у тебя были такие косяки? А то я пока даже не знаю за что зацепиться...
a22 (2006-09-11 18:50:00) [9]я много раз сталкивался с такими вещами и практически каждый раз вина была на самом программисте, а не на среде разработки или каких-то библиотеках. ищи. может, у тебя треды какие-нибудь с переменными работают.. мало ли, по такому описанию выводы делать тяжело