Autor Beitrag
asbito
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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):
ausblenden 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.


Zuletzt bearbeitet von F34r0fTh3D4rk am So 28.02.10 14:41, insgesamt 2-mal bearbeitet
asbito Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Fr 12.02.10 14:39 
Hey ok danke. ich werds so machen :)

lg asbito.
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Sa 13.02.10 22:16 
Wenn die Reihenfolge egal ist, geht löschen auch so:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Sa 27.02.10 21:06 
Und das verschieben müsste ja dann so gehen:
ausblenden 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.