Einzelnen Beitrag anzeigen

Shakyamuni

Registriert seit: 30. Apr 2008
9 Beiträge
 
#3

AW: function mit Array - trotz gleichen Typs "Inkompatible Typen"

  Alt 10. Mär 2011, 13:29
Du hast doch schon den richtigen Ansatz:
Du musst alle array vom Typ TArra haben, dann sollte es gehen, oder?
Oh ._. auf einmal funktioniert es

Aber im eigentlichen Programm macht das Probleme:
Delphi-Quellcode:
procedure Tsortalgo.MergeSortRun;
var
  i: integer;
begin
  SetLength(mlist,1);
  mlist[0] := 0;
  for i := 0 to elements-1 do
    begin
      SetLength(mlist, High(mlist));
      mlist[i] := StrToInt(ListBox_List.Items[i]);
    end;
  mlist := MergeSort(mlist);
end;

function Tsortalgo.Merge(llst, rlst: TArray): TArray;
var
  n: integer;
begin
  SetLength(result,elements);
  n := 0;
  while (High(llst)>0) and (High(rlst)>0) do
    begin
      if llst[0] <= rlst[0]
        then
          begin
            result[n] := llst[0];
            n := n+1;
            llst := RemoveItem(llst, 0);
          end
        else
          begin
            result[n] := rlst[0];
            n := n+1;
            rlst := RemoveItem(rlst, 0);
          end;
    end;
  while High(llst)>0 do
    begin
      result[n] := llst[0];
      n := n+1;
      llst := RemoveItem(llst, 0);
    end;
  while High(rlst)>0 do
    begin
      result[n] := rlst[0];
      n := n+1;
      rlst := RemoveItem(rlst, 0);
    end;
end;

function Tsortalgo.MergeSort(lst: TArray): TArray;
var
  q, i: integer;
  llst, rlst: TArray;
begin
  if High(lst) <= 1
    then
      result := lst
    else
      begin
        q := High(lst);
        for i := 0 to round(q/2) do
          begin
            llst[i] := lst[i];
          end;
        for i := round(q/2) to q do
          begin
            rlst[i] := lst[i];
          end;
      end;
  llst := MergeSort(llst);
  rlst := MergeSort(rlst);
  result := Merge(llst, rlst);
end;

function Tsortalgo.RemoveItem(lst: TArray; n: integer): TArray;
var
  i: integer;
begin
  for i := n to High(lst) do
    begin
      lst[i] := lst[i+1];
    end;
  SetLength(lst, High(lst)-1);
end;
Da spuckt er mir am Ende ein "Exception EAccessViolation". Hab ich vielleicht irgendwo eine Grenze zu hoch gesetzt?

Geändert von Shakyamuni (10. Mär 2011 um 14:26 Uhr)
  Mit Zitat antworten Zitat