![]() |
Re: Array-Delete Funktion
Klassen sind ja mit Record sehr verwandt. Man könnte auch eine TObjectList verwenden
|
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 |
Re: Array-Delete Funktion
Mein bisheriger Code:
Delphi-Quellcode:
Also ich hab da schon Code nur ist es möglich, eine Funktion zu schreiben,
// 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); die ein beliebiges Array annimmt? (Vllt. mit dem Move-Befehl???) |
Re: Array-Delete Funktion
vll. mit sowas wie
Delphi-Quellcode:
Aber ich glaube nicht, dass du das Array in der Prozedur verändern darfst ...
procedure DeleteIndex(var arr: Array of const; index: Integer)
@Edit: Mit dem Movebefehl kannst du schnell viele arrayelemente verschieben, aber ich glaube, du darfst trotzdem nicht setlength aufrufen, um die länge anzupassen ;) |
Re: Array-Delete Funktion
Also das würde heißen ich bräuchte eine Funktion wie die hier?
Delphi-Quellcode:
und das Verschieben dann mit Move.
procedure DeleteIndex(arr: Pointer; index: Integer; ItemSize: Cardinal);
Aber wie müsste man dann wohl setLength manuell machen? |
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. |
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. |
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 ...
![]() ![]() ![]() und nach [dp]*swap*[/dp] kann man ja leider nicht suchen :? |
Re: Array-Delete Funktion
Zitat:
Noch einen schönen Abend Oreaden |
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. |
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