![]() |
Array-Delete Funktion
Hi liebe DP'ler
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? Wenn nein, ist sowas möglich? If not lastQuestion.Possible then, wie gestaltet man am besten eine Funktion, um aus einem bestimmten array ein Element zu löschen? :mrgreen: MFG |
Re: Array-Delete Funktion
Da würde ich eher eine Liste verwenden, da ist dies möglich. es wäre zwar möglich, dies auch für einen Array zu implemnetieren; der Aufwand ist es aber imho nicht wert.
|
Re: Array-Delete Funktion
Moin,
wenn Du das Element n löschen willst, musst Du alle Elemente ab n+1 um eine Position runterschieben und am Schluss kannst Du mit SetLength die Größe des Arrays um 1 verringern. Je nach Größe des Array wird das aber recht langsam werden. Besser ist es vielleicht, das Element n nicht wirklich zu löschen, sondern nur als "gelöscht" zu markieren. Deine Anwendung müsste dann gelöschte Elemente igonrieren. Gruß, Jens |
Re: Array-Delete Funktion
Zitat:
|
Re: Array-Delete Funktion
Aber dann TList. Eine verkettete Liste wäre zwar auch noch eine Option, ist aber um einiges aufwändiger.
|
Re: Array-Delete Funktion
Hi,
Naja an die Leute, die hier groß "TList" rufen:
Delphi-Quellcode:
TList ist ja im Prinzip auch nurn Array ;)
// TList spezifische Dinge weggelassen
procedure TList.Delete(Index: Integer); var Temp: Pointer; begin if (Index < 0) or (Index >= FCount) then exit; Dec(FCount); if Index < FCount then System.Move(FList^[Index + 1], FList^[Index],(FCount - Index) * SizeOf(Pointer)); end; TList gibt allerdings reservierten Speicher nicht frei. Also kein SetLength. PS: Aber handlicher ist TList mit Sicherheit trotzdem :mrgreen: |
Re: Array-Delete Funktion
Hallo,
Zitat:
Das hab ich so auch mal so realisiert, die Elemente erstmal nur zu markieren, hat gut funktioniert. Man kann ja von Zeit zu Zeit das Array wieder bereinigen. Kommt halt immer drauf an, wie man auf die Daten zugreifen will. Wenn man nicht unbedingt über einen Index zugreifen will, kann man auch über doppelt verkettet Listen nachdenken. Dort sind Einfüge und Löschen Operationen schnell möglich. allerdings kann man auf die Daten nur sequenziell zugreifen. Mit den Listen vom Typ "TList" in der Unit Classes hat das nichts zu tun. Die funktionieren intern wieder mit den dynamischen Arrays. Da bei Änderungen immer noch eine virtuelle Notify Funktion aufgerufen wird, ist die Performance mit selbst verwalteten dynamischen Arrays besser. mfg DerDan |
Re: Array-Delete Funktion
Also mir war schon klar, dass man den Inhalt des Arrays neu kopieren muss.
Mir gings mehr um das WIE (Performance). BTW: Ich hab ein Array mit Pointern also wirklich fast ne TList. Der nachteil von TList ist eben nur, dass man ne klasse hat, was ich nur sehr ungern haben will. Ich hätte meine Frage genauer formuliert, musste aber in die Schule :evil: :wall: :dancer2: EDIT: System.Move(FList^[Index + 1], FList^[Index],(FCount - Index) * SizeOf(Pointer)); Was das macht ist mir noch nicht so klar :gruebel: MFG |
Re: Array-Delete Funktion
Zitat:
|
Re: Array-Delete Funktion
da stimme ich dir zum Teil zu.
Doch das ist nicht immer der Fall. Ein Beispiel: RECORDS! Ohne TList könnte ich einfach neue Varieblen davon anlegen, ohne was machen zu müssen. Mit ner klasse müsste ich nen "constructor" (im gewissen Sinne) basteln. Hat denn jmd. nen Code-Vorschlag für mein Problem? EDIT: !!! Korrektur: In meinem Array sind keine Pointer, aber sehr kleine Records, die selten mehr als 5 werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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