![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Dullets [Delphi, Windows]
Filther © (2004-02-29 11:50:00)У меня для описания пуль введены следующие типы
Type
PBulletInfo=^TBulletInfo;
TBulletInfo=Record
X,Y:Integer;
Xinc,Yinc:Integer;
BulletClass:Integer;
End;
Type TBulletsArray=Record
Width:Integer;
Bullets:TList;
End;
И при перещете координат нужно чтобы пуля которая вылетела за
пределы убиралась из списка, но возникает исключение Acsess Violation.
Подскажите что в этой процедуре не так?
Procedure BulletNewCoords;
Var I:Integer;
Ret:PReturnType;
Temp:PBulletInfo;
Begin
If BulletsArray.Width>0 Then Begin
For I:=0 To BulletsArray.Bullets.Count-1 Do begin
Temp:=BulletsArray.Bullets.Items[i];
Temp^.X :=Temp^.X+Temp^.Xinc;
Temp^.Y :=Temp^.Y+Temp^.Yinc;
If (Temp^.X<0) OR (Temp^.y<0) OR
(Temp^.X>Map.Ground.Width*D) Or (Temp^.y>Map.Ground.Heigth*D) Then Begin
BulletsArray.Bullets.Delete(I);
Dispose(Temp);
End;
End;
End;
End;
VMcL (2004-02-29 13:20:00) [1]>>Filther (29.02.04 11:50)
>For I:=0 To BulletsArray.Bullets.Count-1 Do begin
For I:= BulletsArray.Bullets.Count-1 downto 0Do begin
cyborg (2004-02-29 13:14:00) [2]сделай так:
If (Temp^.X<0) OR (Temp^.y<0) OR
(Temp^.X>Map.Ground.Width*D) Or (Temp^.y>Map.Ground.Heigth*D) Then
Begin
BulletsArray.Bullets.Delete(i);
Dec(BulletsArray.Width);
Dispose(Temp);
End elseI:=I+1;
cyborg (2004-02-29 13:12:00) [3]Подозреваю, что будет глюк с пропуском, например ты удалил восьмую, девятая при этом становится восьмой, а ты перескакиваешь на девяиую, в итоге девятая, которая впоследствии, после удаления, становится восьмой "пролетает" в этом цикле.
Filther (2004-02-29 12:56:00) [4]Нет все таки рабочий вариант такой:
Procedure BulletNewCoords;
Var I:Integer;
Ret:PReturnType;
Temp:PBulletInfo;
Begin
If BulletsArray.Width>0 Then Begin
I:=0;
Repeat
Temp:=BulletsArray.Bullets.Items[i];
Temp^.X :=Temp^.X+Temp^.Xinc;
Temp^.Y :=Temp^.Y+Temp^.Yinc;
If (Temp^.X<0) OR (Temp^.y<0) OR
(Temp^.X>Map.Ground.Width*D) Or (Temp^.y>Map.Ground.Heigth*D) Then Begin
BulletsArray.Bullets.Delete(i);
Dec(BulletsArray.Width);
Dispose(Temp);
End;
I:=I+1;
Until I>BulletsArray.BulletS.Count-1;
End;
End;
Спасибо за подсказку, вопрос исчерпан!
Filther (2004-02-29 12:51:00) [5]Блин лажанулся !:
Procedure BulletNewCoords;
Var I:Integer;
Ret:PReturnType;
Temp:PBulletInfo;
Begin
If BulletsArray.Width>0 Then Begin
For I:=0 To BulletsArray.Bullets.Count-1 Do begin
Temp:=BulletsArray.Bullets.Items[i];
Temp^.X :=Temp^.X+Temp^.Xinc;
Temp^.Y :=Temp^.Y+Temp^.Yinc;
If (Temp^.X<0) OR (Temp^.y<0) OR
(Temp^.X>Map.Ground.Width*D) Or (Temp^.y>Map.Ground.Heigth*D) Then Begin
BulletsArray.Bullets.Delete(I);
Dispose(Temp);
Dec(BulletsArray.Width);
End;
End;
End;
End;
Но Dispose(Temp) все-таки нужен!
cyborg (2004-02-29 12:23:00) [6]memory associated
Я понимаю, которые прикреплены к Data вроде или чего-то подобное там, а сам итем по идее должен удаляться.
cyborg (2004-02-29 12:21:00) [7]
> >К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?
> Дык в хелпе написано следующее:
> Note: Delete does not free any memory associated with the
> item.
Возможно, я не проверял, закомментируй, если ошибка исчезнет, может дело в этом.
Filther (2004-02-29 12:11:00) [8]>Удаляешь, индексы меняются, и на последних выходит ацесс виолатион, так, как их уже нет.
Thanks ошибку понял
>К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?
Дык в хелпе написано следующее:
Note: Delete does not free any memory associated with the item.
cyborg (2004-02-29 11:58:00) [9]К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?
cyborg (2004-02-29 11:56:00) [10]Удаляешь, индексы меняются, и на последних выходит ацесс виолатион, так, как их уже нет.