Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.111 c
2-1184848479
Новичеек
2007-07-19 16:34
2007.08.19
из Vb в Delphi


3-1178288128
Inna_Z
2007-05-04 18:15
2007.08.19
Как узнать версию к которой подключились?


2-1185294697
Мануха
2007-07-24 20:31
2007.08.19
stringgrid


2-1185204280
Alexbor777
2007-07-23 19:24
2007.08.19
SQL запрос


2-1185191496
gen
2007-07-23 15:51
2007.08.19
Прошу помощи мастера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский