Autor |
Beitrag |
asbito
      
Beiträge: 33
|
Verfasst: Fr 12.02.10 13:49
Hi leute ich habe einige dynamische arrays erstellt und nun will ich damit arbeiten, wie man die länge verändert, weiss ich und auch wie man diese herraus bekommt.
Aber gibt es eine möglichkeit mit vorgefertigten funktionen mit denen ich elemente verschieben oder löschen kann?
lg asbito
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 12.02.10 14:24
Diese Funktionen wirst du dir wohl selbst schreiben müssen, aber das ist ganz einfach.
Löschen ginge zum Beispiel irgendwie so (ungetestet):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| var index: integer; begin for i := index to length(arr)-2 arr[i] := arr[i+1]; setlength(arr, length(arr)-1); end; |
Hier sieht man auch den Nachteil von Arrays gegenüber listen, da du hier immerhin eine Laufzeit von O(n) hast, wohingegen das Löschen bei Listen in konstanter Laufzeit funktioniert, wenn man das zu löschende Element kennt und nicht danach suchen muss.
Zuletzt bearbeitet von F34r0fTh3D4rk am So 28.02.10 14:41, insgesamt 2-mal bearbeitet
|
|
asbito 
      
Beiträge: 33
|
Verfasst: Fr 12.02.10 14:39
Hey ok danke. ich werds so machen
lg asbito.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Fr 12.02.10 15:02
Hallo!
Verschieben wirst du mit Hand machen müssen, jedenfalls kenne ich keinen Befehl, der dir das abnimmt. Ist aber auch nicht schwer. Sollte auch mit Assembler am speichereffizientesten gehen, aber du kannst im Prinzip, wenns einfach sein soll, ganz einfach mit einem dynamischen Hilfsarray arbeiten.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 13.02.10 03:43
Wenn man sich mit Pointern etwas angefreundet hat, geht das Verschieben von Einträgen mit Move recht einfach, solange der verschobene Eintrag von keinem Finalisierung-benötigenden Typ ist.
Für's Löschen gibt es mehrere Möglichkeiten, abhängig davon, ob die Reihenfolge der Elemente nach dem Löschen wichtig ist.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Sa 13.02.10 22:16
Wenn die Reihenfolge egal ist, geht löschen auch so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var index: integer; begin ...; arr[index] := arr[high(arr)]; setlength(arr, length(arr)-1); end; |
|
|
ffgorcky
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Sa 27.02.10 21:06
Und das verschieben müsste ja dann so gehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure Verschieben(vonIndex, nachIndex:integer) var zwischenSpeicher:string; i:integer; begin if von<nach then begin for i:=von to nach-1 do begin zwischenSpeicher:=deinArray[i+1]; deinArray[i+1]:=deinArray[i]; deinArray[i]:=zwischenSpeicher; end; end else begin for i:=von downto nach+1 do begin zwischenSpeicher:=deinArray[i-1]; deinArray[i-1]:=deinArray[i]; deinArray[i]:=zwischenSpeicher; end; end; |
Ich hoffe, ich erzähle hier keinen "Stuss", aber wenn Du das wirklich einzeln auf- oder absteigen lassen möchtest wäre es so möglich.
|
|
|