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

Вниз

Dullets   Найти похожие ветки 

 
Filther   (2004-02-29 11:50) [0]

У меня для описания пуль введены следующие типы
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;


 
cyborg ©   (2004-02-29 11:56) [1]

Удаляешь, индексы меняются, и на последних выходит ацесс виолатион, так, как их уже нет.


 
cyborg ©   (2004-02-29 11:58) [2]

К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?


 
Filther   (2004-02-29 12:11) [3]

>Удаляешь, индексы меняются, и на последних выходит ацесс виолатион, так, как их уже нет.
 Thanks ошибку понял
>К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?
 Дык в хелпе написано следующее:
 Note: Delete does not free any memory associated with the item.


 
cyborg ©   (2004-02-29 12:21) [4]


> >К тому же зачем Dispose(Temp); если оно уже удалено BulletsArray.Bullets.Delete(I);?
>  Дык в хелпе написано следующее:
>  Note: Delete does not free any memory associated with the
> item.

Возможно, я не проверял, закомментируй, если ошибка исчезнет, может дело в этом.


 
cyborg ©   (2004-02-29 12:23) [5]

memory associated
Я понимаю, которые прикреплены к Data вроде или чего-то подобное там, а сам итем по идее должен удаляться.


 
Filther   (2004-02-29 12:51) [6]

Блин лажанулся !:
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) все-таки нужен!


 
Filther   (2004-02-29 12:56) [7]

Нет все таки рабочий вариант такой:
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;

Спасибо за подсказку, вопрос исчерпан!


 
cyborg ©   (2004-02-29 13:12) [8]

Подозреваю, что будет глюк с пропуском, например ты удалил восьмую, девятая при этом становится восьмой, а ты перескакиваешь на девяиую, в итоге девятая, которая впоследствии, после удаления, становится восьмой "пролетает" в этом цикле.


 
cyborg ©   (2004-02-29 13:14) [9]

сделай так:

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 else I:=I+1;


 
VMcL ©   (2004-02-29 13:20) [10]

>>Filther  (29.02.04 11:50)
>For I:=0 To BulletsArray.Bullets.Count-1 Do begin

For I:=BulletsArray.Bullets.Count-1 downto 0 Do begin



Страницы: 1 вся ветка

Текущий архив: 2004.06.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
3-1085592056
V l a d i m i r
2004-05-26 21:20
2004.06.20
Иерархическая БД и TreeView


4-1084437964
Orion2
2004-05-13 12:46
2004.06.20
Раскладка клавиатуры


14-1086183707
Alibaba
2004-06-02 17:41
2004.06.20
Video -> CD/DVD


3-1085667512
DimonNew
2004-05-27 18:18
2004.06.20
Фильтр по измененным записям


3-1085664101
minstrel
2004-05-27 17:21
2004.06.20
TClientDataSet в действии