Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Array-Delete Funktion (https://www.delphipraxis.net/123915-array-delete-funktion.html)

mkinzler 11. Nov 2008 14:58

Re: Array-Delete Funktion
 
Klassen sind ja mit Record sehr verwandt. Man könnte auch eine TObjectList verwenden

olee 11. Nov 2008 15:02

Re: Array-Delete Funktion
 
Also um das mal klarzustellen:

Ich möchte keinesfalls eine Klasse verwenden!!

1.) Ich habe dieses Array sehr oft (Waypoints in ner Map also ca. 200 mal)
2.) Ich möchte nicht immer die TList / TObjectList neu erstellen.

--> mir gehts nur um die Performance eines Codes, um ein Element aus nem Array zu löschen. :wall:


MFG

olee 11. Nov 2008 15:06

Re: Array-Delete Funktion
 
Mein bisheriger Code:

Delphi-Quellcode:
  // zum löschen von mehreren Elementen gleichzeitig
  j := 0;
  for i := 0 to high(AnArray) do
  begin
    AnArray[i-j] := AnArray[i];
    If AnArray[i].destroyed then inc(j);
  end;
  SetLength(AnArray,Length(AnArray)-j);

  // zum löschen eines Elementes
  for i := Index to high(AnArray)-1 do
  begin
    AnArray[i] := AnArray[i+1];
  end;
  SetLength(AnArray,Length(AnArray)-1);
Also ich hab da schon Code nur ist es möglich, eine Funktion zu schreiben,
die ein beliebiges Array annimmt?

(Vllt. mit dem Move-Befehl???)

jfheins 11. Nov 2008 15:09

Re: Array-Delete Funktion
 
vll. mit sowas wie
Delphi-Quellcode:
procedure DeleteIndex(var arr: Array of const; index: Integer)
Aber ich glaube nicht, dass du das Array in der Prozedur verändern darfst ...

@Edit: Mit dem Movebefehl kannst du schnell viele arrayelemente verschieben, aber ich glaube, du darfst trotzdem nicht setlength aufrufen, um die länge anzupassen ;)

olee 11. Nov 2008 15:20

Re: Array-Delete Funktion
 
Also das würde heißen ich bräuchte eine Funktion wie die hier?

Delphi-Quellcode:
procedure DeleteIndex(arr: Pointer; index: Integer; ItemSize: Cardinal);
und das Verschieben dann mit Move.

Aber wie müsste man dann wohl setLength manuell machen?

Fridolin Walther 11. Nov 2008 15:57

Re: Array-Delete Funktion
 
Hm ... wenn das Array nicht sortiert ist (bzw. nicht sortiert sein muss) wäre die performanteste Lösung wahrscheinlich folgende:

Wenn der zu löschende Eintrag der letzte Eintrag ist, einfach den letzten Eintrag abschneiden. Wenn der zu löschende Eintrag nicht der letzte Eintrag ist, einfach den letzten Eintrag mit dem zu löschenden tauschen und den letzten Eintrag abschneiden.

olee 11. Nov 2008 18:22

Re: Array-Delete Funktion
 
Oh man wie geil!

So simpel aber niemand kommt drauf ... außer dir :mrgreen:

Das ist ja ne perfekte Lösung.

Aber du hast recht. Das ist nur möglich, da ich nie den Index der Elemente
zum Identifizieren benutze.

himitsu 11. Nov 2008 18:49

Re: Array-Delete Funktion
 
ich kann mir irgendwie nicht Helfen, aber ich bin mir sicher hier schon mehrmals Funktionen/Codes zum Einfügen/Löschen von von Einträgen gepostet zu haben :gruebel: ... nur finden ...

Hier im Forum suchenMove Hier im Forum suchenMoveMemory Hier im Forum suchenCopyMemory bringt nicht wirklich was
und nach [dp]*swap*[/dp] kann man ja leider nicht suchen :?

Oreaden 11. Nov 2008 22:07

Re: Array-Delete Funktion
 
Zitat:

Zitat von olee
Gibts ne Funktion, mit der man aus einem Array eines beliebigen Typs
Elemente löschen kann?

Also die das Array automatisch verkleinert und die Elemente entsprechend neu ordnet?

Es gibt ein Objekt das dies leistet. TList und ihre Ableitungen. Diese sind alle Arrays welche zusätzlich die Verwaltungsfunktionen wie verkleinern, neu Ordnen, etc. implementiert haben.

Noch einen schönen Abend
Oreaden

Medium 12. Nov 2008 04:51

Re: Array-Delete Funktion
 
Wenn du die maximale Größe des Arrays kennst, ist das Tauschen und seperate Mitführen des max-Indexes vermutlich wirklich die performanteste Lösung. Dann hast du eigentlich nur noch zwei Stolperfallen: Wenn es zu viele zu große Arrays sind, schlabberst du dir massig RAM weg das schlimmsten Falls zu einem winzigen Bruchteil tatsächlich verwendet wird, und versehentliche Aufrufe von SetLength könnten der Geschwindigkeit so richtig einen Dämpfer verpassen. Aber das "schlimmste" ist eigentlich, dass man sich die Performance durch potentiell gewaltigem Speicherverbrauch im Vergleich zur Nutzdatenmenge erkauft. Wenn die Arrays ohnehin meistens fast voll sind, ist das weniger tragisch. Schön oder elegant ist das halt aber nie. Nur performant :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:53 Uhr.
Seite 2 von 3     12 3      

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