Hallo,
ich habe jetzt deinen Quelltext nicht weiter analysiert.
Solche Probleme treten oft auf, wenn man falsche
Deklarationen macht oder Schleifenvariablen falsch setzt.
Z.B. Arrays fangen oft bei 0 an aber Schleifen
startet man gerne mit 1.
Wenn du Quelltext einstellst, benutze doch bitte
den pre-tag. Dann werden die Einzüge nicht versaut.
Sonst ist es ein Elend, das zu verfolgen.
Die Fehler in seinem eigenen Quelltext zu finden, ist
die Hauptarbeit jedes Programmierers.
Das ist das sogenannte „Debuggen“.
Ein paar Hinweise dazu:
Setze einen Breakpoint an den Anfang deiner Schleife
und gehe schrittweise durch (Taste ).
Lasse dir, während du schrittweise die Sortierschleifen
durchläufst, die Variablen anzeigen.
Dazu kannst du in der „Liste der überwachten Ausdrücke“
Variablen eintragen aber auch während er Abarbeitung
Variablen anzeigen lassen, indem du mit dem Mauszeiger
drauf gehst.
Alternativ kannst du auch Testausgaben machen, die dir
die Zwischenwerte darstellen. Wenn das Problem gelöst
ist, dann löschst du diese wieder oder kommentierst
sie aus, falls du sie noch mal verwenden möchtest.
Es ist auch guter Stil, wenn man seinen Quelltext so
kommentiert, das er quasi selbsterklärend wird.
Gruß Uwi
ich bin gerade dabei mit Delphi Zufallszahlen in Listboxen
mithilfe von Shellsort zu ordnen.
Ich habe festgestellt, dass wenn ich z.B. 5 Zahlen sortieren
möchte, er nur die letzten 4 sortiert. Die erste bleibt aber
unverändert auf ihrem Platz. Woran könnte das liegen?
Mit inbegriffen ist noch eine Zeitmessung.
procedure Tform1.ShellSort(Sender: TObject);
var Abstand, i, j, Merke:integer;
Done :boolean;
Ende, Anfang :real;
begin
Anfang:=Time;
Abstand:=n;
while (Abstand\>1) do
begin
Abstand:=Abstand div 2;
repeat
Done:=True;
for j:= 1 to n-Abstand do
begin
i:=j+Abstand;
if (Zahl[j]\>Zahl[i]) then
begin
Merke:=Zahl[j];
Zahl[j]:=Zahl[i];
Zahl[i]:=Merke;
Done:=False
end;
begin
listbox2.Items.Clear;
for i:=0 to n-1 do
begin
listbox2.items.add(inttostr(Zahl[i]));
end;
Ende:=Time;
end;
end;
until Done;
end;
Ende:=Time;
Edit1.Text:=FloatToStrF((Ende-Anfang)\*24\*3600,ffFixed, 10,5);
end;