Текущий архив: 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.5 MB
Время: 0.006 c