Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi [Gelöst] Aussortieren bei TList (https://www.delphipraxis.net/159181-%5Bgeloest%5D-aussortieren-bei-tlist.html)

Edlmann 17. Mär 2011 11:36


[Gelöst] Aussortieren bei TList
 
Hey DP,

ich baue gerade ein kleines Minigame, bei dem man unter anderem schießen kann (Ja ich weiß, ziemlich kreativ ;) ) und habe für die einzelnen Schüsse
eine Liste vom Typ TLIst erstellt, in welche ich Records mit den Daten von meinem Schuss schreibe. Soweit so gut, auslesen und alles funktioniert auch wunderbar,
das einzige was einfach nicht funktionieren will ist das aussortieren von Schüssen, die nicht mehr gezeichnet werden müssen. Momentan sieht meine Methode dafür
wie folgt aus:

Delphi-Quellcode:
procedure TPlayer.SortShots;
var x: Integer;  
  temp: PShot;
begin
  x := 0;
  while not x > Shots.Count -1 do
  begin
    temp := PShot(Shots.Items[x]);
     if temp.Timer <= 0 then
     begin
        Shots.Remove(temp);
        dispose(temP);
     end
     else
      inc(x);
  end;
end;
Was meiner Meinung nach funktionieren müsste. Shots ist meine TList, und der Typ PShot ist wie folgt deklariert:

Delphi-Quellcode:
type
  PShot = ^TShot;
  TShot = record
  X, Y: Single;
  MRot: Single;
  Timer: Integer;
end;
Allerdings bleibt die Länge meiner TList immer gleich hoch, egal ob ich sortieren lasse oder nicht, und darunter leidet die Performance auf Dauer.
Weiß jemand von euch warum das ganze nicht funktioniert?

Lg, Edlmann

DeddyH 17. Mär 2011 12:04

AW: Aussortieren bei TList
 
Mir fällt erst einmal folgendes auf:
Zitat:

Delphi-Quellcode:
while not x > Shots.Count -1 do

Das sollte wohl
Delphi-Quellcode:
while not (x > Shots.Count -1) do
heißen.

[edit] Verständlicher wird es IMHO so:
Delphi-Quellcode:
procedure TPlayer.SortShots;
var x: Integer;
  temp: PShot;
begin
  for x := Shots.Count -1 downto 0 do
  begin
    temp := PShot(Shots.Items[x]);
    if temp.Timer <= 0 then
    begin
      Shots.Remove(temp);
      dispose(temP);
    end;
  end;
end;
Wobei ich mich frage, was das mit Sortieren zu tun hat, das ist ja höchstens Aussortieren ;)[/edit]

Edlmann 17. Mär 2011 12:21

AW: Aussortieren bei TList
 
Mmh...mal wieder an den Tücken des Delphi-Compilers gescheitert ^^
Danke, mit der Klammer funktioniert alles so wie es soll und ich hab immer nur so 25 Schüsse.
Ich versteh zwar nicht ganz wie der Compiler dass ohne die Klammer interpretiert (muss ja
irgendwie anders sein, ansonsten würds ja funktionieren) aber naja, wieder was gelernt ;)

Und ja, Aussortieren wäre passender, aber Sort is kürzer als Sortout :P

DeddyH 17. Mär 2011 12:27

AW: [Gelöst] Aussortieren bei TList
 
Das ist relativ schnell erklärt. x ist vom Typ integer mit Wert 0, sieht also binär so aus:
Code:
00000000000000000000000000000000
Du fragst aber ohne Klammer auf not x ab (sieht dann so aus):
Delphi-Quellcode:
while (not x) > Shots.Count - 1 do
, was dann
Code:
11111111111111111111111111111111
ergibt. Als Integer ist das -1, das ist niemals größer als Shots.Count - 1 ;)

Edlmann 17. Mär 2011 12:30

AW: [Gelöst] Aussortieren bei TList
 
Macht Sinn, danke für die Erklärung ;)

mleyen 17. Mär 2011 12:33

AW: [Gelöst] Aussortieren bei TList
 
Kurz:
Delphi-Quellcode:
not x
invertiert alle Bits von x.

Und KISS wo es nur geht.
Delphi-Quellcode:
not (x > Shots.Count -1)
.
=>
Delphi-Quellcode:
x <= Shots.Count-1
.
Dann spart man sich öfters solche Fehler. ;)

DeddyH 17. Mär 2011 12:41

AW: [Gelöst] Aussortieren bei TList
 
Ich hätte ja
Delphi-Quellcode:
x < Shots.Count
genommen *g*. Oder eher die absteigende For-Schleife wie oben beschrieben.

Edlmann 17. Mär 2011 13:45

AW: [Gelöst] Aussortieren bei TList
 
Mmmh...soweit hab ich noch nicht gedacht, hab mir halt gedacht
"ne For-Schleife kannst du ja nicht nehmen, denn wenn du ein Element löscht,
rücken die anderen nach" aber wenn mans Rückwärts macht gehts natürlich auch ^^
Da sich das von der Performance her aber nicht viel tut werde ich es so lassen wie ich es jetzt habe ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz