Einzelnen Beitrag anzeigen

MStoll

Registriert seit: 15. Nov 2005
131 Beiträge
 
Turbo Delphi für Win32
 
#1

Größenveränderung bei dyn. Arrays auf Pointerbasis

  Alt 3. Sep 2006, 22:45
Hallo

derzeit bin ich dabei, Array-Operationen (Sortieren, Austauschen, Vergleichen, Löschen, Einfügen) zu verallgemeinern, indem ich Prozeduren schreiben, denen ich ein dyn. Array als Zeiger übergebe (Siehe auch bei den Vorschlägen zur Code-Library, Thread "Shellsort für beliebige Arrays"). Sortieren, Austauschen und Vergleichen (bei statischen Typen!) geht soweit ganz gut allgemein, da sie keine Größenveränderungen am Array verursachen. Hab auch schon ne Basis für eine Lösch-Prozedur. Allerdings will es mir nicht gelingen, dabei die Größe des Arrays innerhalb der Prozedur zu verändern. Deshalb muss ich das immer so aufrufen:
Delphi-Quellcode:
ArrDelete(Arr, Length(Arr), SizeOf(Arr), idx);
SetLength(Arr, Length(Arr)-1);
Die ArrDelete-Prozedur sieht so aus:
Delphi-Quellcode:
procedure Exch(P : Pointer; ElSize : integer; a, b : integer);
var P1, P2 : Pointer;
    B1 : byte;
    x : integer;
begin
     P1 := Pointer(Integer(P) + ElSize * a);
     P2 := Pointer(Integer(P) + ElSize * b);
     
     for x := 0 to ElSize-1 do
     begin
          b1 := Byte(Pointer(Integer(P1)+x)^);
          Byte(Pointer(Integer(P1)+x)^) := Byte(Pointer(Integer(P2)+x)^);
          Byte(Pointer(Integer(P2)+x)^) := b1;
     end;
end;

procedure ArrDelete(P : Pointer; Size, ElSize, Idx : integer);
var x : integer;
begin
     if (Idx < 0) or (Idx >= Size) then
        exit;

     for x := Idx to Size-2 do
         Exch(P, ElSize, x, x+1);
end;
Ich würde nun gern letzteres SetLength irgendwie in die ArrDelete-Prozedur mit reintun.

Hat jemand eine Idee?

Danke
Michael
  Mit Zitat antworten Zitat