Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.03.01;
Скачать: [xml.tar.bz2];

Вниз

Вылет из-за неправильного удаления из TList.   Найти похожие ветки 

 
Б   (2009-01-15 16:13) [0]


Constructor ПУЛИ:
  BulletList.Add(Self);              // Добавляем пулю в список.

Destructor ПУЛИ:                    // Удаляем пулю из списка.
 BulletList.Remove(Self);
 inherited;

OnTimer ГЛОБАЛЬНОГО ТАЙМЕРА:
Var i: word;
begin
 If BulletList.Count > 0 then
    For i:= 0 to BulletList.Count - 1 do
      TBullet(BulletList[i]).Move;


 
  При нажатии на кнопку создаётся пуля.
  В процедуре движения пуля уничтожается в случае выхода за пределы формы.
 
ВОПРОС: При уничтожении пули, программ сразу же вылетает.


 
Б   (2009-01-15 16:15) [1]

Начало ---> http://delphimaster.net/view/2-1231532495/


 
Юрий Зотов ©   (2009-01-15 16:18) [2]

> Б

1. If BulletList.Count > 0 then - эту строку надо просто выкинуть.
2. For i := BulletList.Count - 1 downto 0 do
     TBullet(BulletList[i]).Move;


 
Ega23 ©   (2009-01-15 16:20) [3]

А ты её внутри Bullet.Move убить пытаешься?


 
Б   (2009-01-15 16:23) [4]

2 Юрий Зотов

Большое Вам спасибо!
Не думал, что из-за цикла так происходит.

> 1. If BulletList.Count > 0 then - эту строку надо просто выкинуть.

Если её убрать, программа мигом вылетает.


 
Медвежонок Пятачок ©   (2009-01-15 16:25) [5]

В процедуре движения пуля уничтожается в случае выхода за пределы формы.


 
Б   (2009-01-15 16:25) [6]

> А ты её внутри Bullet.Move убить пытаешься?

Там находится функция, определяющая вышла ли Пуля за пределы формы.
Если Да (True), то она уничтожается.


 
Медвежонок Пятачок ©   (2009-01-15 16:25) [7]

ну вот и ответ на вопрос


 
Юрий Зотов ©   (2009-01-15 16:27) [8]

> Б   (15.01.09 16:23) [4]

> Если её убрать, программа мигом вылетает.

Такого быть не должно, потому что если BulletList.Count  = 0, то цикл просто ни разу не выполнится и больше ничего не произойдет.

А если такое все же есть, то это значит, что программа содержит ошибку. Очень советую эту строчку все же убрать, а ошибку найти и устранить.


 
Ega23 ©   (2009-01-15 16:27) [9]


> Там находится функция, определяющая вышла ли Пуля за пределы
> формы.
> Если Да (True), то она уничтожается.
>


Тогда всё понятно.


 
Б   (2009-01-15 16:33) [10]

При вылете, выдаёт такое: "List index out of bounds (65535)".

Ошибок нет. Весь нужный код уже сдесь.


 
Ega23 ©   (2009-01-15 16:34) [11]


> Ошибок нет


Ошибок есть.


 
Медвежонок Пятачок ©   (2009-01-15 16:34) [12]

BulletList.Count - 1

0-1 = 65535


 
Б   (2009-01-15 16:35) [13]

> Ошибок есть

Где? Сдесь всё по Пуле.


 
Медвежонок Пятачок ©   (2009-01-15 16:35) [14]

Просто у тебя пули разрывные. Запрещенные.


 
Ega23 ©   (2009-01-15 16:35) [15]


> Медвежонок Пятачок ©   (15.01.09 16:34) [12]


Ну и зря.


 
MBo ©   (2009-01-15 16:42) [16]

бомбу же сам заложил в виде счетчика типа word

Var i: Integer;


 
Б   (2009-01-15 16:47) [17]

2 MBo

Хм... Заработало. Спасибо.
Диапазон WORD от 0 до 65 535 - должно было работать, ведь количество элементов в списке с 0 начинается.


 
MsGuns ©   (2009-01-15 16:49) [18]

При циклическом просмотре списка с удалением надо использовать обратный отсчет


 
Медвежонок Пятачок ©   (2009-01-15 16:50) [19]

ведь количество элементов в списке с 0 начинается

но пули-то летят, пули.
в окопах сидят солдаты.
и пули вылетают за пределы экрана.

и вот их уже меньше чем ноль.


 
Б   (2009-01-15 16:50) [20]

> При циклическом просмотре списка с удалением надо использовать обратный отсчет

Теперь понятно. Не знал.


 
Б   (2009-01-15 16:52) [21]

> и вот их уже меньше чем ноль.

Как же их может быть меньше чем 0?,
Создал 10 и удалил ТОЖЕ 10.


 
Б   (2009-01-15 16:55) [22]

> При циклическом просмотре списка с удалением надо использовать обратный отсчет

И при обычном нормально работает.


 
Медвежонок Пятачок ©   (2009-01-15 16:55) [23]

Как же их может быть меньше чем 0?,

да индекс не корректируется после ремува.
неужели так сложно понять?


 
Б   (2009-01-15 17:00) [24]

Некоректируется? А должно.


 
Медвежонок Пятачок ©   (2009-01-15 17:02) [25]

Ну так корректируй, если должно.
Или программируй так, что бы не надо было корректировать


 
Anatoly Podgoretsky ©   (2009-01-15 17:02) [26]


> Б   (15.01.09 16:47) [17]

А цикл работает с Integer.


 
Юрий Зотов ©   (2009-01-15 17:07) [27]

> Б   (15.01.09 16:52) [21]

> Как же их может быть меньше чем 0?

Чему должно стать равным i, чтобы цикл закончился?
Оно должно стать равным -1. Вот и меньше нуля.

Завершился последний проход цикла (при i=0). Идет проверка, надо ли делать следующий проход. Для проверки нужно уменьшить i и сравнить его с нулем. Уменьшается i и оно получается равным 65535 (потому что word). Это число не меньше нуля, поэтому начинается следующий проход цикла. И при обращении к BulletList[65535] вылетаем за пределы списка.


 
Б   (2009-01-15 17:10) [28]

Теперь всё понятно.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.03.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
15-1230620523
Урсулапов_
2008-12-30 10:02
2009.03.01
Как подключиться к удаленному реестру?


3-1215956504
Olegus
2008-07-13 17:41
2009.03.01
IB API


2-1232019643
pavelkq
2009-01-15 14:40
2009.03.01
Сравнинеи двух image.


6-1199970944
samalex
2008-01-10 16:15
2009.03.01
Закачать файл на LINUX


15-1230713121
RUBEY
2008-12-31 11:45
2009.03.01
Подключить компоненты





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