![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вылет из-за неправильного удаления из TList. [D7]
Б © (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), то она уничтожается.
>
Тогда всё понятно.