Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

olee 11. Nov 2008 06:42


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

mkinzler 11. Nov 2008 06:45

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.

Nersgatt 11. Nov 2008 06:48

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

Medium 11. Nov 2008 09:05

Re: Array-Delete Funktion
 
Zitat:

Zitat von mkinzler
Da würde ich eher eine Liste verwenden

Das, und nichts anderes.

DeddyH 11. Nov 2008 09:23

Re: Array-Delete Funktion
 
Aber dann TList. Eine verkettete Liste wäre zwar auch noch eine Option, ist aber um einiges aufwändiger.

Neutral General 11. Nov 2008 09:41

Re: Array-Delete Funktion
 
Hi,

Naja an die Leute, die hier groß "TList" rufen:

Delphi-Quellcode:
// 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 ist ja im Prinzip auch nurn Array ;)

TList gibt allerdings reservierten Speicher nicht frei. Also kein SetLength.

PS: Aber handlicher ist TList mit Sicherheit trotzdem :mrgreen:

DerDan 11. Nov 2008 09:48

Re: Array-Delete Funktion
 
Hallo,



Zitat:

Zitat von Nersgatt
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


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

olee 11. Nov 2008 14:50

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

mkinzler 11. Nov 2008 14:52

Re: Array-Delete Funktion
 
Zitat:

Der nachteil von TList ist eben nur, dass man ne klasse hat,
was ich nur sehr ungern haben will.
OOP würde ich eher als Vorteil ansehen

olee 11. Nov 2008 14:55

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.
Seite 1 von 3  1 23      

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