Einzelnen Beitrag anzeigen

Isildur

Registriert seit: 7. Nov 2007
2 Beiträge
 
#5

Re: Probleme bei der Implementierung von Radixsort

  Alt 8. Nov 2007, 13:01
Hier zur Klärung von Anzahl und Feld(vorgegeben, nicht von mir geschrieben)
Delphi-Quellcode:
const max = 2000;
type TSortieren = class
    private
      Feld : array [0..max] of String;
      Anzahl : Integer;
[...]
procedure TSortieren.DatenLaden(Dateiname : String);
 var i : Integer;
 begin
   kAnzeigefenster.DateiInMemo(Dateiname);
   Anzahl := kAnzeigefenster.getAnzahl;
   if Anzahl > max then anzahl := max;
   for i := 1 to Anzahl do
       Feld[i] := kAnzeigefenster.getZeile(i-1);
end;
Delphi-Quellcode:
function TfrmAnzeigen.getAnzahl: Integer;
begin
  getAnzahl := memAnzeige.Lines.Count;
end;
Feld ist von 0 an deklariert wird aber erst ab 1 benutzt(siehe for-Schleife), m.E. müsste es for i := o to Anzahl-1 heißen. Dass hier ein statischer Array mit jeder Menge leeren Elementen verwendet wird - nya ist halt so..

Edit:Problem scheint gelöst zu sein. Es gab mehrere Fehler, einer der wichtigsten und verstecktesten war der, dass temp[j] nicht auf die Länge 0 zurück gesetz wurde und setlength in der Partionierung daher mist gebaut hat. So scheint es augenblicklich zu klappen(ich glaube es noch nicht ganz aber bisher keine Fehler)
Delphi-Quellcode:
procedure TSortieren.RadixSort;
var sorttil, i, j, k, l: integer;
var temp : array[0..255] of array of string; //array für alle ansichars
var pos : integer;
var ansi : integer;
begin
for sorttil := 4 downto 1 do begin
  //Partionierungsphase
  for i:=0 to Anzahl-1 do begin
    if length(Feld[i]) >= sorttil then begin
      ansi := ord(Feld[i,sorttil]);
      pos := length(temp[ansi]);
      if length(temp[ansi])-1 < 0 then pos := 0;
      setlength(temp[ansi],length(temp[ansi])+1);
      temp[ansi,pos] := Feld[i];
      Feld[i]:=''
    end;
  end;
  //Sammelphase
  l := 0;
  j := 0;
  repeat
    for k := 0 to length(temp[j])-1 do begin
      if length(temp[j])>=k+1 then begin
        Feld[l] := temp[j,k];
        temp[j,k] := '';
        l := l+1;
      end;
    end;
    setlength(temp[j],0);
    j := j+1;
  until j >= 255;
end;

end;
  Mit Zitat antworten Zitat