AGB  ·  Datenschutz  ·  Impressum  







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

System.Delete und dynamische Arrays

Ein Thema von Bbommel · begonnen am 7. Okt 2025 · letzter Beitrag vom 9. Okt 2025
Antwort Antwort
Seite 1 von 2  1 2      
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
680 Beiträge
 
Delphi 12 Athens
 
#1

System.Delete und dynamische Arrays

  Alt 7. Okt 2025, 15:35
Delphi-Version: 12 Athens
Hi alle,

ich brauche mal euer Schwarmwissen, weil ich mich gerade über mich selber bzw. über alten Code von mir wundere. Ich habe seit sehr, sehr vielen Jahren eine olle Funktion "RemoveFromRealArray", die genau das macht, was sie sagt: Löscht aus einem Array von Real-Werten einen per Index angegebenen Eintrag. Damals habe ich da irgendwas mit "Move" gemacht, um die Elemente eins nach vorne zu schieben. Stand bestimmt so irgendwo im Netz oder hier in der DP - und ist ja auch kein Hexenwerk und funktioniert.

Jetzt wollte ich nach längerer Zeit mal wieder was aus einem Array von einem anderen Typ löschen (meistens arbeiten wir bei uns im Code mit Listen oder anderen Strukturen) und habe mich gewundert, dass es für diese Standardaufgabe nix fertiges gibt. Gibt ja auch mittlerweile TArray und so.

Letztlich bin ich dann ganz einfach bei System.Delete gelandet und wundere mich, warum ich da früher was eigenes für gebastelt habe. Mein alter Code muss so von 2008 oder 2009 sein (damals hatten wir leider noch kein Repository, insofern kann ich nicht nachgucken). Konnte System.Delete damals noch kein Array? Oder gab und gibt es gute Gründe, es anders zu machen? Oder hab ich das damals einfach nur übersehen und es erst jetzt, 16-17 Jahre später bemerkt?

Vielleicht kann ja jemand etwas Licht ins Dunkel bringen. Vielleicht hat ja jemand D2007 und kann mal schauen, ob das dort auch schon ging.
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
667 Beiträge
 
Delphi XE6 Enterprise
 
#2

AW: System.Delete und dynamische Arrays

  Alt 7. Okt 2025, 16:36
Bei Delphi XE6 gehts nicht, bei Delphi 10.2 gehts schon.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
680 Beiträge
 
Delphi 12 Athens
 
#3

AW: System.Delete und dynamische Arrays

  Alt 7. Okt 2025, 16:46
Bei Delphi XE6 gehts nicht, bei Delphi 10.2 gehts schon.
Danke dir fürs Testen/Nachschauen. XE6 ist definitiv neuer als der Code (zumindest seine ursprüngliche Form) - das erklärt dann, warum ich das so gelöst habe.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: System.Delete und dynamische Arrays

  Alt 7. Okt 2025, 17:16
TArray<> ist garnicht nötig ... geht mit allen dynamischen Arrays.

Aber falls du doch TArray meints, die Klasse.
Da gibt es z.B. auch so ein nettes TArray.Sort (aber leider nur für sortierte Arrays)


Delete und Insert wurde, nach über 20 Jahren, endlich im XE7 repariert hinzugefügt,
unter dem Thema "string-like array operators"

ebenso wie
Delphi-Quellcode:
const
  C: array of Cardinal = [257];

var
  A, B: array of string;

A := A + B;
A := A + ['aa'];
A := A + ['bb', 'cc', 'dd'];
https://docwiki.embarcadero.com/RADS...Types_(Delphi)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 7. Okt 2025 um 17:26 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
680 Beiträge
 
Delphi 12 Athens
 
#5

AW: System.Delete und dynamische Arrays

  Alt 8. Okt 2025, 09:21
Delete und Insert wurde, nach über 20 Jahren, endlich im XE7 repariert hinzugefügt,
unter dem Thema "string-like array operators"
Ah, alles klar. Danke für die genaue Aufklärung und die zeitliche Eingrenzung.

Das Hinzufügen mit A:=A+['SomeString'] nutze ich schon länger fleißig, aber das in dem Zuge auch Delete und Insert angepasst wurden, ist komplett an mir vorbeigegangen (ich hab aber bis gestern auch nicht mehr danach gesucht - zumindest ich baue viel öfter ein Array zusammen, als dass ich mal was daraus löschen muss).

Danke an alle - wieder was gelernt!
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.538 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: System.Delete und dynamische Arrays

  Alt 8. Okt 2025, 09:25
Das Hinzufügen mit A:=A+['SomeString'] nutze ich schon länger fleißig, ...
Das ist aber eine relativ langsame Operation. Wenn Du das in einer Schleife machst dann erwäge es unter Umständen anders zu machen.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
680 Beiträge
 
Delphi 12 Athens
 
#7

AW: System.Delete und dynamische Arrays

  Alt 8. Okt 2025, 09:59
Das Hinzufügen mit A:=A+['SomeString'] nutze ich schon länger fleißig, ...
Das ist aber eine relativ langsame Operation. Wenn Du das in einer Schleife machst dann erwäge es unter Umständen anders zu machen.
Die Stellen, an denen ich das nutze, sind bei mir keine zeitkritischen Punkte, aber dennoch ein guter Hinweis.

Zum Verständnis: meinst du langsam, weil bei jedem Schleifendurchlauf einzeln die Länge angepasst und damit Speicher reserviert werden muss und man sollte daher, bei bekannter Gesamtlänge, besser vorweg ein "SetLength" auf die Gesamtlänge setzen? Oder ist der Ansatz mit A:=A+['somestring'] noch langsamer, als wenn man früher in einer Schleife ein Setlength(A,length(A)+1) gemacht hat?

Falls letzteres der Fall ist, wäre das gut zu wissen, denn solche alten Stellen ändere ich teilweise, weil ich die moderne Variante viel besser lesbarer finde (und es halt nur eine anstatt zwei oder drei Zeilen sind), aber ich will den Code natürlich nicht unnötig langsam machen, selbst wenn es an den Stellen nicht kritisch ist.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.538 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: System.Delete und dynamische Arrays

  Alt 8. Okt 2025, 12:54
Ja, vorweg ein "SetLength" auf die Gesamtlänge hilft bei der Geschwindigkeit.
Es muss sonst nicht nur "die Länge angepasst und damit Speicher reserviert werden", sondern auch noch der alte Inhalt in den neuen Speicher übertragen werden.
Aber: mir ist Lesbarkeit auch sehr wichtig. Ein einfaches "+" ist dann oft doch besser.

Geändert von freimatz ( 8. Okt 2025 um 13:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.921 Beiträge
 
Delphi 13 Florence
 
#9

AW: System.Delete und dynamische Arrays

  Alt 8. Okt 2025, 15:00
Es muss sonst nicht nur "die Länge angepasst und damit Speicher reserviert werden", sondern auch noch der alte Inhalt in den neuen Speicher übertragen werden.
Ein SetLength auf einen String oder ein Array behält den bisherigen Array-Inhalt bei, außer natürlich Elemente die bei einer Verkürzung entfernt werden.
Zitat:
For a dynamic array variable, SetLength reallocates the array referenced by S to the given length. Existing elements in the array are preserved and newly allocated space is set to 0 or nil.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: System.Delete und dynamische Arrays

  Alt 8. Okt 2025, 15:07
Jupp, es wird erstmal versucht dahinterligender freier Speicher anzuhängen
und wenn das nicht geht, dann wird neuer Speicher reserviert und der Inhalt umkopiert. (inkl. AdressAnpassungen, z.B. für WeakVariablen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:48 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