| Autor |
Beitrag |
klezmor
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Do 08.06.06 09:57
Mein 1.Problem ist folgendes, während meine Sortieralgorithmus verschieden lange shapes sortiert, soll dies graphisch veranschaulicht werden. Da dies, jedoch viel zu schnell geht, sollt ich wohl am besten einen sleep Befehl einbauen, dies scheint jedoch ziemlich schwer zu werden, da der algorithmus rekursiv arbeitet und es dann sein könnte, dass ich plötzlich sehr sehr viele sleeps "praktisch, gleichzeitig" aufrufe.
2. Während die funktion die shapes vertauscht, soll dies auch auf der form aktualisiert werden, damit man diesen quicksort algorithmus besser nachvollziehen kann, hat jemand ne ahnung mit welchem befehl ich das machen könnte?
Hier der Sourcecode:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure Tform1.SortByQuickSort(which:byte; iLo, iHi: Integer); var Lo, Hi, Mid, T: Integer; begin Lo := iLo; Hi := iHi; Mid := Line[which][(Lo + Hi) shr 1].Width; repeat while Line[which][Lo].Width < Mid do Inc(Lo); while Line[which][Hi].width > Mid do Dec(Hi); if Lo <= Hi then begin T := Line[which][Lo].Width; Line[which][Lo].Width := line[which][Hi].Width; Line[which][Hi].Width := T; Inc(Lo); Dec(HI); end; until Lo > Hi; if Hi > iLo then SortByQuickSort(0, iLo, Hi); if Lo < iHi then SortByQuickSort(0, Lo, iHi); end; |
Moderiert von raziel: Delphi-Tags hinzugefügt
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
Arno Nym
      
Beiträge: 131
|
Verfasst: Do 08.06.06 10:14
Hi!
hab den Code zwar jetzt nicht durchgesehen, (es fehlen da übrigens die Delphi-Tags...)
aber in rekursiven Proceduren gibt es ja immer ne Abbruchbedingung, die wird auch nur einmal aufgerufen, wenn du da das Sleep reinsetzt, müsste es doch gehen oder ?
MFG, Arno Nym
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 08.06.06 10:33
also um veränderungen sichtbar zu machen würd ich
Delphi-Quelltext 1:
| application.processmessages |
verwenden, somit ist die form beweglich jeder button klickbar und veränderungen erkennt man auch
aber obs "langsam" genug ist, um die shape-bewegungen zu sehen weiß ich nicht
mit sleep würd ich nicht arbeiten denn da hängt die anwendung für einige zeit (die übergebenem millisekunden).
mal schauen was noch für ideen kommen
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Do 08.06.06 10:58
Hab das ganze jetzt mit diesem Delay und dem refresh abgeändert, funktioniert hervorragend. Mein Programm soll die verschiedenen Sortieralgorithmen präsentieren.
Alle Algorithmen sollen dann gleichzeitig ablaufen, so dass man schön sehen kann, wie schnell der jeweilige ist, ich finde einfach diese DelphiTabs nihct wo sind denn die?
Kennt sich jemand von euch gut mit sortieralgorithmen aus?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure Tform1.SortByQuickSort(which,delay:byte; iLo, iHi: Integer); var Lo, Hi, Mid, T: Integer; begin Lo := iLo; Hi := iHi; Mid := Line[which][(Lo + Hi) shr 1].Width; repeat while Line[which][Lo].Width < Mid do Inc(Lo); while Line[which][Hi].width > Mid do Dec(Hi); if Lo <= Hi then begin T := Line[which][Lo].Width; Line[which][Lo].Width := line[which][Hi].Width; Line[which][Hi].Width := T; Inc(Lo); Dec(HI); form1.Refresh; sleep(delay); end; until Lo > Hi; if Hi > iLo then SortByQuickSort(0,delay, iLo, Hi); if Lo < iHi then SortByQuickSort(0,delay, Lo, iHi); end; |
Moderiert von jasocul: Delphi-Tags hinzugefügt
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Do 08.06.06 11:45
Ich schicke euch mal die exe, die unteren Linien, werden gar nicht sortiert, das habe ich so festgelegt, die haben gar nichts mit den oberen zu tun, bis auf das, dass sie im gleichen array wie die oberen stehen. Seltsamerweise bewegen sich die oberen linien des unteren Quadranten auch, wenn ich die oberen sortieren lasse. Dass ist wohl eine Speicherverletzung, oder was meint ihr?
Einloggen, um Attachments anzusehen!
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Do 08.06.06 14:52
Ok habs geschafft, das war eine von mir verursachte Speicherverletzung des arrays, immer diese indizes, man weiß nie ob bei null oder 1  .
ABer hätte noch ne andere Frage, wie kann nich die Zeit nehmen, die ein algorithmus braucht, um das array zu sortieren?
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Do 08.06.06 15:53
Ich bekomme immer eine Speicherverletzung, wenn ich diesen Sortier Algorithmus, auf diese erzeugten Tlines bzw. Shapes anwende:
Erzeugung:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| procedure Tform1.DrawLines(const posLeft,posTop,algorithm:integer; var dates:array of integer); var count:integer; begin
randomize; for count:=0 to numberlines-1 do begin
Line[algorithm][count]:=TLine.create(Form1); with Line[algorithm][count] do begin Shape:=form; Parent := self; doublebuffered:=true; Left:=posleft; width:=dates[count]; height:=LineHeight; top:=posTop+count*(height+distance); if odd(count) then Brush.Color := LineColor1 else Brush.Color := LineColor2; end;
end;
end; Sortieralgorithmus anwenden: Lo := iLo; Hi := iHi; Mid := form1.Line[which][random(Hi)].Width; repeat while form1.Line[which][Lo].Width > Mid do Inc(Lo); while form1.Line[which][Hi].width < Mid do Dec(Hi); if Lo <= Hi then begin synchronize(Display); Inc(Lo); Dec(HI); sleep(delay); end; until Lo > Hi; if Hi > iLo then QuickSort(0,delay, iLo, Hi); if Lo < iHi then QuickSort(0,delay, Lo, iHi); end; |
Wenn which 0 ist, dann läuft alles ohne Probleme, ist which aber 1 kommt immer eine Fehlermeldung-->Speicherverletzung, an was könnte das liegen?
Moderiert von Christian S.: Delphi-Tags hinzugefügt
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
klezmor 
      
Beiträge: 558
delphi 6 personal delphi 2005 personal
|
Verfasst: Do 08.06.06 17:09
ich versuche 2 Threads gleichzeitig laufen zu lassen, aber das klappt nicht, kann mir jemand sagen wieso, hier der code der jeweiligen threads:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TQuicksortThread.execute; begin QuickSort(Quick,delay,0,numberlines-1); end;
procedure TBubbleThread.execute; var count:integer; begin showmessage('Wieso Funktioniere ich nicht?'); for count:=numberlines-1 to 1 do begin form1.Label1.Caption:=inttostr(count); if form1.line[1][count].width>form1.line[1][count-1].width then begin bigger:=count; smaller:=count-1; synchronize(Display); sleep(delay); end;
end; end; |
Der erste wird ohne Probleme ausgeführt aber der 2.macht gar nichts.
Moderiert von Christian S.: Delphi-Tags hinzugefügt
_________________ "Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
|
|
|