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

Вниз

Вылет из-за неправильного удаления из 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.015 c
15-1230723251
Чудак
2008-12-31 14:34
2009.03.01
Отдача файла скриптом php


2-1232197869
Любитель
2009-01-17 16:11
2009.03.01
Ошибка при установке


2-1232345049
Ruslan777
2009-01-19 09:04
2009.03.01
Проверка нажатия кнопки во цикле?


2-1232099268
buzb
2009-01-16 12:47
2009.03.01
изменение размера компонентов.


2-1232114477
n00b
2009-01-16 17:01
2009.03.01
помогите с переводом с С++ на делфи