AW: Array mit Recordinhalten löschen
Zitat:
Delphi-Quellcode:
Und jetzt stelle man sich vor, dass man 5 versch. Arrays bzw. Listen hat.
// a.)
// löschen eines Elements in einem Array var i, x : integer; begin x := 4; // Element Position die gelöscht werden soll for i:= x+1 to High(MyArray) do begin MyArray[i-1] := MyArray[i]; end; SetLength(MyArray, Length(MyArray)-1); end; // b.) // und jetzt das Gleiche mit einer Liste MyList.Delete(4); Welcher Lösung wäre zu bevorzugen 5 * a.) oder 5 * b.) ? Den Code bei a.) habe einfach so hingeschrieben; es ist gut möglich dass er Fehler hat. (Es sind übrigens min. 2 Fehler enthalten - wer findet sie?) Bei b.) ist es ausgeschlossen, dass ein Fehler enthalten ist. |
AW: Array mit Recordinhalten löschen
Ich verwende auch in C# Arrays, wenn mir das reicht, insofern bin ich kein blinder Delphi-Entwickler.
Übrigens lösche ich in Arrays, in dem ich z.B. das letzte Element in den zu löschenden Index kopiere, die Anzahl verringere und freue mich, das ich das in O(1) hinbekommen habe. Aber Du musst schon genau lesen, was ich schreibe. Wenn ich nicht löschen muss, sondern z.B. nur einen Container für ein paar Dinger brauche, nehme ich ein Array. Sonst etwas anderes. Eine Liste nehme ich selten, eher eine Map, Dictionary oder whatever. |
AW: Array mit Recordinhalten löschen
Schwierig sind am Anfang Ins und Del. Hat man das aber einmal "geschafft", wo ist das Problem?
Delphi-Quellcode:
Dennoch, grundsätzlich gebe ich Dir Recht. Seit ich TList ect. für mich entdeckt habe, leite ich mir zu 80 % was ab, bet TList auch z.B. wegen dem genialen QuickSort (Sort(@MyCompare) und gut ist.
procedure TIntegerList.Ins(Index, Value: integer);
var I: integer; begin SetCount(FCount + 1); for I:= FCount - 1 downto Index + 1 do FItems[I]:= FItems[I - 1]; SetItem(Index, Value); end; procedure TIntegerList.Del(Index: integer); var I: integer; begin for I:= Index to FCount - 2 do FItems[I]:= FItems[I + 1]; SetCount(FCount - 1); end; Nur für mathematische Gleichungssysteme ect., da sind m.E. Array's sozusagen unschlagbar. |
AW: Array mit Recordinhalten löschen
Natürlich es es kein Problem, es ist nur blöd, das immer selbst zu coden. Also verwendet man, wenn möglich, andere Datenstrukturen. Das war zwar nicht Thema dieses Threads, aber wenn wir schon beim Thema sind....
|
AW: Array mit Recordinhalten löschen
Ja. Dreimal Ja. Das war eigentlich ein Antwort auf #11. :)
|
AW: Array mit Recordinhalten löschen
Zitat:
Wenn man eine direkte Freiblockliste anstellen eines "Pegelstands" verwendet, kann man sogar auf das potenziell aufwendige Kopieren des letzten Elements verzichten :) |
AW: Array mit Recordinhalten löschen
Gerade für die Datensicherheit beim Bearbeiten von Arrays hab ich endlich mal einen Vorschlag gemacht. (darf man gerne für voten)
http://qc.embarcadero.com/wc/qcmain.aspx?d=110391 Die schnelleren Zugriffe über Move und Co. sind da ja schonmal ganz schön fehleranfällig. Derartige Codes kann man aber auch schon in älteren Delphis nutzen, außer daß man sich dort die Funktionen für jeden Arraytypen einzeln implementieren müste/sollte. |
AW: Array mit Recordinhalten löschen
Zitat:
Delphi-Quellcode:
Müsste das nich eher
if @Value = @Value then
exit;
Delphi-Quellcode:
heißen?
if @Value1 = @Value2 then
exit; |
AW: Array mit Recordinhalten löschen
Dieser böse Copy&Paste-Notepadprogrammierung-Codevervollständigung funktioniert auch nich immer. :(
Hmm, warum kann ich via WebQC nix editieren, was über QCApp geschrieben wurde? |
AW: Array mit Recordinhalten löschen
Himitsu, in der Insert ist das überflüssig und in der Remove sogar falsch?
Delphi-Quellcode:
FillChar(Values[Index], SizeOf(T), 0);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:54 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