Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо