Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Arbeiten mit dynamischen Arrays


asbito - Fr 12.02.10 13:49
Titel: Arbeiten mit dynamischen Arrays
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 - 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; // dieser eintrag soll gelöscht werden
begin
  // Überschreibe das Element mit seinem Nachfolger
  for i := index to length(arr)-2 
    arr[i] := arr[i+1]; 
  // Dekrementiere die Länge des Arrays
  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.


asbito - Fr 12.02.10 14:39

Hey ok danke. ich werds so machen :)

lg asbito.


Jakob_Ullmann - 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 - 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.


F34r0fTh3D4rk - 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; // zu löschender Index
begin
  ...; // Hier am besten noch ne Bereichs-Prüfung machen
  arr[index] := arr[high(arr)];
  setlength(arr, length(arr)-1);
end;


ffgorcky - 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 //also wenn von kleiner ist als nach
  for i:=von to nach-1 do
    begin
    zwischenSpeicher:=deinArray[i+1];
    deinArray[i+1]:=deinArray[i];
    deinArray[i]:=zwischenSpeicher;
    end;
  end
else
  begin //sonst das ganze einfach andersherum:
  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.