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;