Autor Beitrag
klezmor
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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:

ausblenden 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; //index
   Hi := iHi; //index
   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 user profile iconraziel: Delphi-Tags hinzugefügt

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
Arno Nym
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Do 08.06.06 10:33 
also um veränderungen sichtbar zu machen würd ich

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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?

ausblenden 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; //index
   Hi := iHi; //index
   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 user profile iconjasocul: Delphi-Tags hinzugefügt

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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 :lol: :cry: .
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: Do 08.06.06 15:53 
Ich bekomme immer eine Speicherverletzung, wenn ich diesen Sortier Algorithmus, auf diese erzeugten Tlines bzw. Shapes anwende:

Erzeugung:

ausblenden volle Höhe 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:
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 // farbige Bälle
      else               Brush.Color := LineColor2;
      end;

    end;

end;
Sortieralgorithmus anwenden:
 Lo := iLo; //ganz oben
   Hi := iHi; //ganz unten
   Mid := form1.Line[which][random(Hi)].Width;
   //Mid := form1.Line[which][(Lo + Hi) shr 1].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 user profile iconChristian S.: Delphi-Tags hinzugefügt

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth
klezmor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 558


delphi 6 personal delphi 2005 personal
BeitragVerfasst: 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:


ausblenden 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 user profile iconChristian S.: Delphi-Tags hinzugefügt

_________________
"Beware of bugs in the above code; I have only proved it correct, not tried it." Donald Knuth