AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

dynamisches arry "rückwärts" löschen

Ein Thema von dajuhsa · begonnen am 23. Jun 2007 · letzter Beitrag vom 24. Jun 2007
Antwort Antwort
Benutzerbild von dajuhsa
dajuhsa

Registriert seit: 20. Apr 2007
397 Beiträge
 
Turbo Delphi für Win32
 
#1

dynamisches arry "rückwärts" löschen

  Alt 23. Jun 2007, 23:34
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?
das Essen ist wie das Internet - Downstream ist immer angenehmer als Upstream
-
Warum missbraucht die ganze Programmierwelt Images als Paintboxen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 23. Jun 2007, 23:38
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.
Markus Kinzler
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 23. Jun 2007, 23:39
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
  Mit Zitat antworten Zitat
Benutzerbild von dajuhsa
dajuhsa

Registriert seit: 20. Apr 2007
397 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 23. Jun 2007, 23:48
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.

@CalganX: Danke, wenigstens etwas
das Essen ist wie das Internet - Downstream ist immer angenehmer als Upstream
-
Warum missbraucht die ganze Programmierwelt Images als Paintboxen
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

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

  Alt 24. Jun 2007, 00:44
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 24. Jun 2007, 05:41
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);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz