Главная страница
    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.049 c
2-1185278362
Dr. Andrew
2007-07-24 15:59
2007.08.19
Как корректно указать параметры в функции GetWindowsDirectoryW?


2-1185427023
Inearthed
2007-07-26 09:17
2007.08.19
Одинаковая обработка разных событий. Как?


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


15-1184882265
Kostafey
2007-07-20 01:57
2007.08.19
Поиск в Access - базе


2-1185530869
gray_falcon
2007-07-27 14:07
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский