Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dynamisches arry "rückwärts" löschen (https://www.delphipraxis.net/94592-dynamisches-arry-rueckwaerts-loeschen.html)

dajuhsa 23. Jun 2007 22:34


dynamisches arry "rückwärts" löschen
 
Erstmal Hallo, Delphianer!

Mein Problem: Wie kann ich die Erste Variable in einem Dynamischen Array löschen, also z.B:
dynArray[0] = 5
dynArray[1] = 7
dynArray[2] = 4
dynArray[3] = 9

-----------Erstes löschen

dynArray[0] = 5
dynArray[1] = 7
dynArray[2] = 4
dynArray[3] = 9

-----------Ergebnis:

dynArray[0] = 7
dynArray[1] = 4
dynArray[2] = 9

-----------Ich weiß es geht auch mit Code-Bröseln aber das ist mir dann doch zu umständlich, geht das auch einfacher?

mkinzler 23. Jun 2007 22:38

Re: dynamisches arry "rückwärts" löschen
 
Den ersten kannst du nicht so Löschen. Du mußt erst den Letzten auf den Vortletzten, ..., 2. auf den 1. Kopieren und dann den Letzen Löschen.

CalganX 23. Jun 2007 22:39

Re: dynamisches arry "rückwärts" löschen
 
Delphi-Referenz durchsuchenMove und SetLength verwenden, wäre eine Idee.

@mkinzler: mit Move kann man auch ganze Blöcke verschieben. Sprich das ganze Array ab [1] bis zum Ende um -1 verschieben.

Chris

dajuhsa 23. Jun 2007 22:48

Re: dynamisches arry "rückwärts" löschen
 
Zitat:

Du mußt erst den Letzten auf den Vortletzten, ..., 2. auf den 1. Kopieren und dann den Letzen Löschen.
das meinte ich mit Code-Brösel, deswegen hab ich ja gefragt.
außerdem:

Zitat:

[0]=5 [1]=3 [2]=7 [3]=9 [4]=1 letzter auf vorletzter
[0]=5 [1]=3 [2]=7 [3]=1 [4]=1 4.er auf 3.er
[0]=5 [1]=3 [2]=1 [3]=1 [4]=1 3.er auf 2.er
[0]=5 [1]=1 [2]=1 [3]=1 [4]=1 2.er auf 1.er
[0]=1 [1]=1 [2]=1 [3]=1 [4]=1
wenn schon andersrum. :mrgreen:

@CalganX: Danke, wenigstens etwas :thumb:

Hawkeye219 23. Jun 2007 23:44

Re: dynamisches arry "rückwärts" löschen
 
Hallo,

bei der Verwendung von Move ist eine Warnung angebracht. Falls das Array dynamische Daten (Objektreferenzen, Interfaces, Ansi-/WideStrings) enthält, sind zusätzliche Schritte notwendig, um den Delphi-MemoryManager nicht zu verwirren. Die zu überschreibenden Elemente müssen vor dem Verschieben durch einen Aufruf von Delphi-Referenz durchsuchenFinalize finalisiert werden, Objekte sind freizugeben. Die freiwerdenden Elemente müssen mit NIL überschrieben werden, da sonst im Array mehrere Verweise auf einen Speicherbereich existieren.

Ein kleines Beispiel mit AnsiStrings:

Delphi-Quellcode:
var
  i : Integer;
  Texte : array of string;
begin
  // Array initialisieren
  SetLength (Texte, 10);
  for i := 0 to High(Texte) do
    Texte[i] := Format('Element #%d', [i]);
  // die zu überschreibenden Elemente finalisieren
  Finalize (Texte[0]); // alternativ: Zuweisung eines Leerstrings
  Finalize (Texte[1]);
  // Verschiebung durchführen
  Move (Texte[2], Texte[0], (Length(Texte) - 2) * SizeOf(Texte[0]));
  // freiwerdende Elemente mit NIL überschreiben
  Pointer(Texte[Length(Texte) - 2]) := nil;
  Pointer(Texte[Length(Texte) - 1]) := nil;
  // Array verkürzen
  SetLength (Texte, Length(Texte) - 2);
end;
Enthält das Array keine dynamischen Daten, ist der ganze Aufwand natürlich nicht notwendig.

Gruß Hawkeye

himitsu 24. Jun 2007 04:41

Re: dynamisches arry "rückwärts" löschen
 
also für einen zu löschenden Eintrag:
dabei muß man aber wissen wie das Array aufgebau ist und wie es mit Zeigern und Co. darin aussieht.
Delphi-Quellcode:
// die zu überschreibenden Elemente finalisieren
Texte[0] := ''; // oder halt Finalize(Texte[0]);
// Verschiebung durchführen
Move(Texte[1], Texte[0], (Length(Texte) - 1) * SizeOf(Texte[0]));
// freiwerdende Elemente mit 0 überschreiben
Pointer(Texte[Length(Texte) - 1]) := nil;
// Array verkürzen
SetLength(Texte, Length(Texte) - 1);
Delphi-Quellcode:
für ein einfaches IntegerArray würde z.B. schon das reichen:
// Verschiebung durchführen
Move(Texte[1], Texte[0], (Length(Texte) - 1) * SizeOf(Texte[0]));
// Array verkürzen
SetLength(Texte, Length(Texte) - 1);

im Prinziep geht es eigentlich so:
Delphi-Quellcode:
// Verschiebung durchführen
for i := 1 to High(Texte) do
  Texte[i - 1] := Texte[i];
// Array verkürzen
SetLength(Texte, Length(Texte) - 1);


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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