Те кто щупал Blitz3D знают что не одна программа на нем не обходиться без тамошних типов (связных списков).
Type tparticle
Field x#,y#,life%
End type
For particles.tparticle=Each tparticle
......................
Next
и тд.
Очень удобная вещь для кучи обьектов, обычно частиц.
Вопрос: Есть ли в Дельфи средства для реализации столь же удобного связного(динамического) списка? Желательно без указателей.
А в чем сомнения? Связный список - довольно распространенная структура данных.
Если без указателей, то через классы:
TParticle = class
x, y, z: Single;
next: TParticle;
end;
Наверное, если реалтзовать соответсвующий интерфейс, то и foreach заработает с ним.:)
Только неясно, чем оно удобнее скажем, массива?
Aslan
>много динамически выделяемых объектов могут дать сильную фрагментацию кучи и тормоза
Если все они одного типа и стандартный дельфевый манагер памяти, то множественные удаления/выделения объектов ничего фрагментировать и тормозить не будут.
С динамическими массивами не так удобно, как в Блиц.
Блиц3Д код
For particle.tparticle=Each tparticle particle.life=particle.life+1 if particle.life>100 then delete(particle) Next
На Дельфи
For i:=0 to High(particle) do if particle[i]<>nil then begin particle[i].life=particle[i].life+1; if particle[i].life>100 then particle[i]:=nil; end; Next
C Классами пока не понял как реализовать.
Aslan
> С динамическими массивами еще лучше )))
> // скопировать массив сам в себя, умершие частицы пропустить
>................
> particles[count]:=particles[i];
> Inc(count);
>..................
> // сократить размер
> SetLength(particles,count);
Вот это место я не понял :-) Тут надо наоборот
> particles[i]:=particles[count];
> Dec(count);
Или я загоняюсь? (простужен я).
> Delphi Class - вообще не используй, он распределяется только в динамической
> памяти, надо освобождать через Free.
> Если нужны классы, используй Object
Спасибо за совет.
А что по поводу TObjectsList ? Стоит юзать?
Тема в архиве.