Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

Орех какой-то :)   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
6-1168162326
_darksidenv
2007-01-07 12:32
2007.08.19
Winsock API и accept


2-1184781110
Sdubaruhnul
2007-07-18 21:51
2007.08.19
Поиск файлов возвращает артефакты


4-1172649288
Gavrila
2007-02-28 10:54
2007.08.19
CreateProcess на WinTS 2003 не могу запустить cmd-файл


1-1180368669
Dmitry_177
2007-05-28 20:11
2007.08.19
Перехват клавиатуры


2-1185342922
gen
2007-07-25 09:55
2007.08.19
*.gif, *.jpeg