Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вылет из-за неправильного удаления из TList. [D7]


Страницы:   1 2

Б ©   (2009-01-15 16:13:00) 


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 17:10:00) [1]

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


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

> Б   (15.01.09 16:52) [21]

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

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

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


Anatoly Podgoretsky   (2009-01-15 17:02:00) [3]


> Б   (15.01.09 16:47) [17]

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


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

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


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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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

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


MsGuns   (2009-01-15 16:49:00) [11]

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


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

2 MBo

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


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

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

Var i: Integer;


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


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


Ну и зря.


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

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


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

> Ошибок есть

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


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

BulletList.Count - 1

0-1 = 65535


Ega23   (2009-01-15 16:34:00) [18]


> Ошибок нет


Ошибок есть.


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

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

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


Ega23   (2009-01-15 16:27:00) [20]


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


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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо