![]() |
ersten n Elemente aus einem dynamischen Array ausschneiden
Wie geht das?
Gruss Sven:) |
Re: ersten n Elemente aus einem dynamischen Array ausschneid
Indem du jedes einzelne Element um n Indizes vorschiebst und dann dann SetLength mit Length(...) - n aufrufst. Wenn du dir das ersparen willst, solltest du dir die Klasse
![]() ![]() ![]() |
Re: ersten n Elemente aus einem dynamischen Array ausschneid
Also mit einer TStringList:
Delphi-Quellcode:
geht das ganz einfach so:
var Liste: TStringList;
Delphi-Quellcode:
For i:=1 to n do
begin If Liste.Count=0 then Exit; Liste.Delete(0); end; Da bei einem Array die Anzahl der Zeilen vordefiniert ist, kannst du nicht nachträglich im Quellcode die Anzahl der Zeilen verändern. z.B.:
Delphi-Quellcode:
Dann hast du 20 Zeilen, da kannste keine einfach so rausnehmen.
var Liste: Array[1..20] of Strings;
Höchstens so:
Delphi-Quellcode:
Aber dann hast du immer noch 20 Zeilen, bloß die ersten n Zeilen sind halt einfach leer.
For i:=1 to n do
begin Liste[i]:=''; If i=20 then Exit; end; |
Re: ersten n Elemente aus einem dynamischen Array ausschneid
Zitat:
[add] Außerdem muss die Schleife natürlich bis n - 1 laufen. [/add]
Delphi-Quellcode:
oder
for i := 0 to n - 1 do
Strings.Delete(0);
Delphi-Quellcode:
for i := n - 1 downto 0 do
Strings.Delete(i); |
Re: ersten n Elemente aus einem dynamischen Array ausschneid
So, hab meinen Beitrag oben geändert.
Jetzt müsste es so funzen. |
Re: ersten n Elemente aus einem dynamischen Array ausschneid
Hi.
Zitat:
Delphi-Quellcode:
Grüße vom marabu
type
TBaseType = integer; TIntegerArray = array of TBaseType; procedure DeleteElements(var da: TIntegerArray; start, count: cardinal); var i: integer; begin if count > (length(da) - start) then count := Length(da) - start else Move(da[start + count], da[start], SizeOf(TBaseType) * (Length(da) - start - count)); SetLength(da, Length(da) - count); end; |
Re: ersten n Elemente aus einem dynamischen Array ausschneid
Schon von Copy() und Slice() gehört? Markieren und F1 drücken. Borland hat für dyn. Arrays schon vorgesorgt.
|
Re: ersten n Elemente aus einem dynamischen Array ausschneid
Hallo Andreas,
vielen Dank für diese Information. Da ich in noch keinem Projekt dynamische Arrays eingesetzt habe, ist mir das völlig entgangen. Freundliche Grüße vom marabu |
Re: ersten n Elemente aus einem dynamischen Array ausschneid
Ansonsten auch unbedingt setLength zum ändern der Größe vermeiden. Wurde bestimmt schon in einigen Threads behandelt, kann zu tierischen Speicherlecks führen. Am besten dafür vorgesehene Funktionen (die ja schon von jpg gepostet wurden) verwenden. Bei häufigem setLength ist der Speicher schnell sinnlos weg.
Gruß Der Unwissende |
Re: ersten n Elemente aus einem dynamischen Array ausschneid
@marabu: Move darf man aber nur bei Elementtypen verwenden, die keine Initialisierung oder Finalisierung benötigen, also insbesondere keine Strings sind oder beinhalten.
Ansonsten sollte man den Bereich, den man überschreiben will, vorher mit Finalize finalisieren und den hinten überstehenden Quellbereich mit FillChar leeren - oder in einer Schleife von Hand die Einträge kopieren. @Der_Unwissende: SetLength hat mit den Speicherlecks eigentlich nichts zu tun... @jbg: slice kenn' ich nicht :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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