| Autor | 
Beitrag | 
 
Dude566 
        
 
Beiträge: 1592 
Erhaltene Danke: 79 
 
W8, W7 (Chrome, FF, IE) 
Delphi XE2 Pro, Eclipse Juno, VS2012 
 | 
Verfasst: Fr 06.02.09 19:11 
 
Also hier habe ich mal eine Prozedur die ein Array mit 1000 Speicherplätzen, welches mit Zufallszahlen im Wertebereich von 1 bis 5000 befüllt ist, sortiert.
 
Das Problem ist nur wenn ich sie dann Sortieren möchte, stürzt mir das Programm ohne eine Fehlermeldung ab.
 																	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:
  				 | 									public   procedure qsort (links, rechts : integer);
  procedure TForm1.qsort;     var       i, j, pivot, hilf : integer;      begin      i := links;      j := rechts;        if i < j then begin           pivot := zahlen[(links)-(rechts) div 2];        Repeat              while zahlen[i] < pivot do Inc(i);              while zahlen[j] > pivot do Dec(i);          if i <= j then             begin             hilf := zahlen[i];             zahlen[i] := zahlen[j];             zahlen[j] := hilf;             Inc(i);             Dec(j);             end;        until (i>j);        qsort(1, j);        qsort(1000, i );        for i := 1 to 1000 do ListBox2.Items.Add(IntToStr(zahlen[i]));                      end;      end;
  procedure TForm1.Button2Click(Sender: TObject); begin ListBox2.Clear; qsort(1, 1000); end;					 				 | 			 		 	  
Gruß Dude566  
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  
 | 
 
 |  
Narses 
        
   
Beiträge: 10183 
Erhaltene Danke: 1256 
 
W10ent 
TP3 .. D7pro .. D10.2CE 
 | 
Verfasst: Fr 06.02.09 19:38 
 
Moin!
 
	   Dude566 hat folgendes geschrieben  : | 	 		  | Das Problem ist nur wenn ich sie dann Sortieren möchte, stürzt mir das Programm ohne eine Fehlermeldung ab. | 	 
 Und, was hast du schon zur Fehlersuche unternommen? Vielleicht mal ein paar Debugausgaben und etwas weniger Elemente, um das mal Schrittweise durchzugehen?   
cu
 Narses  
_________________ There are 10 types of people - those who understand binary and those who don´t.
  
 | 
 
 |  
jfheins 
        
 
Beiträge: 918 
Erhaltene Danke: 158 
 
Win 10 
VS 2013, VS2015 
 | 
Verfasst: Fr 06.02.09 19:51 
 
 | 
 
 |  
Webo 
        
 
Beiträge: 577 
Erhaltene Danke: 14 
 
Win 7, Debian 
C# (Visual Studio 2013), PHP, C, C++ (Eclipse, KDevelop) 
 | 
Verfasst: Fr 06.02.09 20:15 
 
	   Dude566 hat folgendes geschrieben  : | 	 		  | stürzt mir das Programm ohne eine Fehlermeldung ab. | 	  
Hängt es sich auf oder beendet es einfach ?
 Wenn es sich nur aufhängt solltest du darüber nachdenken, ob das Programm in der Zeit vielleicht einfach nur sortiert ? Je nach Code, Rechner und Inhalt kann das  schon mal länger dauern.  
_________________ Man kann nur das aus dem Ärmel schütteln, was man auch vorher reingesteckt hat.
  
 | 
 
 |  
ub60 
        
 
Beiträge: 764 
Erhaltene Danke: 127 
 
 
 
 | 
Verfasst: Sa 07.02.09 01:13 
 
So auf den ersten Blick sehe ich 2 Fehler. Richtig ist es so:
 
		                                                          Delphi-Quelltext                                	 															1: 2: 3:
  				 | 									  pivot := zahlen[(links+rechts) div 2];   ...   qsort(i,1000);					 				 | 			 		 	  
ub60  
 
 | 
 
 |  
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: Sa 07.02.09 02:02 
 
	   Dude566 hat folgendes geschrieben  : | 	 		  		                                                          Delphi-Quelltext                                	 															1: 2: 3: 4:
  				 | 									public   procedure qsort (links, rechts : integer);
  procedure TForm1.qsort;					 				 | 			 		 	   | 	 
 Auch wenn das  leider so funktioniert:
 Schreib besser die Parameter dazu, dann kommt man nicht so leicht durcheinander... 		                                                          Delphi-Quelltext                                	 															1: 2: 3: 4:
  				 | 									public   procedure qsort (links, rechts : integer);
  procedure TForm1.qsort(links, rechts : integer);					 				 | 			 		 	  Und eine bessere Formatierung (Einrückung) des Quelltextes wäre auch sinnvoll.
 Ich weiß: Beides ist kein Fehler, trägt aber zum Machen von Fehlern bei.   
Die Fehler wurden ja bereits gesagt, der letztere kam vielleicht daher, dass du nicht die Parameter dazugeschrieben hattest.  
 
 | 
 
 |  
Dude566   
        
 
Beiträge: 1592 
Erhaltene Danke: 79 
 
W8, W7 (Chrome, FF, IE) 
Delphi XE2 Pro, Eclipse Juno, VS2012 
 | 
Verfasst: Sa 07.02.09 13:20 
 
Ja, ich weis das Punkt vor Strich geht, aber es stand genau so an der Tafel, hatte aber vergessen zu Fragen ob es wirklich so ist.
 Und wo schalte ich die Bereichsprüfung an? Schritte? Ich finde es so nicht.
 	   Webo hat folgendes geschrieben  : | 	 		  	   Dude566 hat folgendes geschrieben  : | 	 		  | stürzt mir das Programm ohne eine Fehlermeldung ab. | 	  
 
 Hängt es sich auf oder beendet es einfach ?
 
 Wenn es sich nur aufhängt solltest du darüber nachdenken, ob das Programm in der Zeit vielleicht einfach nur sortiert ? Je nach Code, Rechner und Inhalt kann das  schon mal länger dauern. | 	  
Nein es hängt sich wirklich auf, und dauert nicht einfach nur lange.
 Und beenden will es sich dann auch nicht mehr lassen.
 	   jaenicke hat folgendes geschrieben  : | 	 		  	   Dude566 hat folgendes geschrieben  : | 	 		  		                                                          Delphi-Quelltext                                	 															1: 2: 3: 4:
  				 | 									public   procedure qsort (links, rechts : integer);
  procedure TForm1.qsort;					 				 | 			 		 	   | 	  Auch wenn das leider so funktioniert:
 Schreib besser die Parameter dazu, dann kommt man nicht so leicht durcheinander...		                                                          Delphi-Quelltext                                	 															1: 2: 3: 4:
  				 | 									public   procedure qsort (links, rechts : integer);
  procedure TForm1.qsort(links, rechts : integer);					 				 | 			 		 	  Und eine bessere Formatierung (Einrückung) des Quelltextes wäre auch sinnvoll.
 
 Ich weiß: Beides ist kein Fehler, trägt aber zum Machen von Fehlern bei.  
 
 Die Fehler wurden ja bereits gesagt, der letztere kam vielleicht daher, dass du nicht die Parameter dazugeschrieben hattest. | 	  
Ok das mit der Übersichtlichkeit ist wahr, da habe ich manchmal meine Probleme und bin
 mir nicht sicher wo ich wie einrücken sollte.
 Gibt es da irgendwelche Regeln oder Vorlagen die weit verbreitet sind?
 Edit: Nach den vorgeschlagenen Verbesserungen funktioniert es immer nocht nicht, wie schalte ich denn die Bereichsprüfung ein?  
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  
 | 
 
 |  
Thorsten83 
        
 
Beiträge: 191 
Erhaltene Danke: 1 
 
 
 
 | 
Verfasst: Sa 07.02.09 13:38 
 
Hey, 
 hab zwar nicht die ganz große Ahnung von Delphi, aber
 		                                                          Quelltext                                	 															1: 2:
  				 | 									while zahlen[i] < pivot do Inc(i); while zahlen[j] > pivot do Dec(i);					 				 | 			 		 	  
sieht auf jeden Fall nicht richtig aus    
 
 | 
 
 |  
Dude566   
        
 
Beiträge: 1592 
Erhaltene Danke: 79 
 
W8, W7 (Chrome, FF, IE) 
Delphi XE2 Pro, Eclipse Juno, VS2012 
 | 
Verfasst: Sa 07.02.09 13:44 
 
Wieso das ist der Vergleich und das eventuelle Weiterrücken im Teilarray. 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  
 | 
 
 |  
Thorsten83 
        
 
Beiträge: 191 
Erhaltene Danke: 1 
 
 
 
 | 
Verfasst: Sa 07.02.09 13:51 
 
Hey, 
 
 ja, aber du benutzt beide Male i, was dazu führen müsste dass du einfach endlos da hängen bleibst... 
 
 | 
 
 |  
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: Sa 07.02.09 13:53 
 
 | 
 
 |  
ub60 
        
 
Beiträge: 764 
Erhaltene Danke: 127 
 
 
 
 | 
Verfasst: Sa 07.02.09 13:57 
 
So, heute nacht war ich wohl doch etwas müde, so dass mir eine Menge Fehler nicht aufgefallen sind.    
- Bei der zweiten Schleife hattest Du i dekrementiert, da muss j hin.
  - Die if-then-Anweisungen müssen vor den Aufruf von Quicksort, damit wird gleichzeitig die Abbruchbedingung gesichert. Am Anfang bringt das nichts.
  - Die 1 und die 1000 im rekursiven Aufruf sind zwar für den ersten Aufruf sinnvoll, später müssen sie aber durch die jeweilige linke und rechte Grenze ersetzt werden.
  - Die Schleife mit der Ausgabe hat in Quicksort überhaupt nichts zu suchen! Die Ausgabe sollte erst nach dem Aufruf von Quicksort erfolgen.
   
So sollte es jetzt wirklich funktionieren    ;
 		                                                          Delphi-Quelltext                                	 															1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
  				 | 									procedure TForm1.qsort(links, rechts : Integer); var i, j, pivot, hilf : integer; begin   i := links;   j := rechts;   pivot := zahlen[(links+rechts) div 2];   Repeat     while zahlen[i] < pivot do Inc(i);     while zahlen[j] > pivot do Dec(j);     if i <= j then       begin         hilf := zahlen[i];         zahlen[i] := zahlen[j];         zahlen[j] := hilf;         Inc(i);         Dec(j);       end;   until (i>j);   if links<j then qsort(links, j);   if i<rechts then qsort(i, rechts ); end;					 				 | 			 		 	  
ub60  
 
 | 
 
 |  
Dude566   
        
 
Beiträge: 1592 
Erhaltene Danke: 79 
 
W8, W7 (Chrome, FF, IE) 
Delphi XE2 Pro, Eclipse Juno, VS2012 
 | 
Verfasst: Sa 07.02.09 14:38 
 
Oh man waren da schusselige Fehler drin, man merkt mir fehlt die Praxis.^^
 
Aber funktionieren will es immer noch nicht....ich suche und suche...
 																	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: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
  				 | 									procedure TForm1.qsort (links, rechts : integer); var    i, j, pivot, hilf : integer; begin      i := links;      j := rechts;        if i < j then begin           pivot := zahlen[(links+rechts) div 2];           Repeat              while zahlen[i] < pivot do Inc(i);                 while zahlen[j] > pivot do Dec(i);          if i <= j then                         begin             hilf := zahlen[i];             zahlen[i] := zahlen[j];             zahlen[j] := hilf;             Inc(i);             Dec(j);             end;        until (i>j);               if links < j then qsort(links, j);        if rechts > i then qsort(i, rechts);                      end; end;
 
  procedure TForm1.FormCreate(Sender: TObject); begin      randomize; end;
 
  procedure TForm1.Button1Click(Sender: TObject); var    i : integer; begin ListBox1.Clear;      for i := 1 to 1000 do          begin          zahlen[i] := random(5001)+1;          ListBox1.Items.Add(IntToStr(zahlen[i]));          end; end;
 
  procedure TForm1.Button2Click(Sender: TObject); var    i : integer; begin ListBox2.Clear; qsort(1, 1000);          for i := 1 to 1000 do ListBox2.Items.Add(IntToStr(zahlen[i])); end;
  end.					 				 | 			 		 	   
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  
 | 
 
 |  
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: Sa 07.02.09 14:49 
 
 | 
 
 |  
Thorsten83 
        
 
Beiträge: 191 
Erhaltene Danke: 1 
 
 
 
 | 
Verfasst: Sa 07.02.09 14:50 
 
Hey, 
 erstmal ist der Fehler immer noch drin,
 		                                                          Quelltext                                	 															1:
  				 | 									while zahlen[j] > pivot do Dec(i);					 				 | 			 		 	  
Überleg mal was dein Programm macht, wenn i=j ist   
edit: also in der "repeat (...) until(...)"-Schleife  
 
 | 
 
 |  
Dude566   
        
 
Beiträge: 1592 
Erhaltene Danke: 79 
 
W8, W7 (Chrome, FF, IE) 
Delphi XE2 Pro, Eclipse Juno, VS2012 
 | 
Verfasst: Sa 07.02.09 14:53 
 
F*** vergessen...is mir das peinlich.    
Ja super jetzt funktioniert es!
 Danke an euch.  
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  
 | 
 
 |  
Dude566   
        
 
Beiträge: 1592 
Erhaltene Danke: 79 
 
W8, W7 (Chrome, FF, IE) 
Delphi XE2 Pro, Eclipse Juno, VS2012 
 | 
Verfasst: Mi 11.02.09 20:05 
 
So läuft alles prima, habe noch eine grafische Darstellung des Sortiervorgangs gemacht.
 
Das Programm läuft aber nur stabil und hängt sich nicht auf, wenn man nebenbei nach dem Start kein anderes Programm oder Fenster in Benutzung hat.
 Wenn man dies nicht beachtet, bleibt es scheinbar hängen, schaut man nach kurzer Zeit wieder darauf ist einfach garnichts gezeichnet, obwohl es schon damit angefangen hatte.
 																	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: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100:
  				 | 									procedure TForm1.qsort (links, rechts : integer); var    i, j, pivot, hilf : integer; begin      i := links;      j := rechts;        if i < j then begin           pivot := zahlen[(links+rechts) div 2];           Repeat              while zahlen[i] < pivot do Inc(i);                 while zahlen[j] > pivot do Dec(j);          if i <= j then                         begin             hilf := zahlen[i];             zahlen[i] := zahlen[j];             zahlen[j] := hilf;             Inc(i);             Dec(j);             end;        until (i>j);               if links < j then qsort(links, j);        if rechts > i then qsort(i, rechts);                      end;        paint; end;
  procedure TForm1.paint; var    i, j, k : integer;    punkt, punkt2, posi : integer; begin PaintBox1.Refresh; punkt  := 0; punkt2 := 0; posi := 0; PaintBox1.Canvas.Pen.Color := clRed; for k := 1 to 200 do     begin     posi := posi +2;     PaintBox1.Canvas.MoveTo (posi, 400);     PaintBox1.Canvas.LineTo (posi, 400 - (zahlen[k]));     sleep(1);     end;
  PaintBox1.Canvas.Pen.Color := clBlack;      PaintBox1.Canvas.MoveTo (0,0);      PaintBox1.Canvas.LineTo (0,400);      PaintBox1.Canvas.LineTo (400,400); for i := 1 to 40 do begin                     punkt := punkt + 10;                     PaintBox1.Canvas.MoveTo (punkt,400);                     PaintBox1.Canvas.LineTo (punkt,395);                     end; for j := 1 to 40 do begin                     punkt2 := punkt2 + 10;                     PaintBox1.Canvas.MoveTo (0, punkt2);                     PaintBox1.Canvas.LineTo (5, punkt2);                     end; end;
 
  procedure TForm1.FormCreate(Sender: TObject); begin      randomize; end;
 
  procedure TForm1.Button1Click(Sender: TObject); var    i : integer; begin ListBox1.Clear;      for i := 1 to 200 do          begin          zahlen[i] := random(401)+1;          ListBox1.Items.Add(IntToStr(zahlen[i]));          end; paint; end;
 
  procedure TForm1.Button2Click(Sender: TObject); var    i : integer; begin ListBox2.Clear; qsort(1, 200);          for i := 1 to 200 do ListBox2.Items.Add(IntToStr(zahlen[i])); end;
 
 
  end.					 				 | 			 		 	  
Im Anhang ist das fertige Programm zum Testen.
 Gruß Dude566  
Einloggen, um Attachments anzusehen!
 
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  
 | 
 
 |  
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: Mi 11.02.09 20:24 
 
Ist paint das OnPaint der PaintBox? Dann wäre es kein Wunder, denn du rufst darin  PaintBox1.Refresh; auf. Und das wiederum ruft ja Paint auf --> Endlosschleife.
 Zudem: Wozu zeichnest du jedesmal alles neu, das flackert doch nur, wenn du das ohne Hintergrundbitmap machst. Schau dir einmal die mitgelieferte Demo zu Threads und Sortieren an.   
Die liegt bei Turbo Delphi unter:
 		                                                          Quelltext                                	 															1:
  				 | 									C:\Program Files\Borland\BDS\4.0\Demos\DelphiWin32\VCLWin32\Threads					 				 | 			 		 	  
Bzw unter älteren Versionen unter:
 		                                                          Quelltext                                	 															1:
  				 | 									C:\Program Files\Borland\DelphiX\Demos\Threads					 				 | 			 		 	  
Zudem hier ein Beispiel zur TPaintBox selbst:
 www.michael-puff.de/...ffScreenBitmap.shtml
Dein Beispiel sieht bei mir ohnehin seltsam aus. Die Titelleiste sieht uralt aus, ich weiß nicht genau warum, aber die neue Oberfläche funktioniert bei deinem Programm nicht.  
 
 | 
 
 |  
Dude566   
        
 
Beiträge: 1592 
Erhaltene Danke: 79 
 
W8, W7 (Chrome, FF, IE) 
Delphi XE2 Pro, Eclipse Juno, VS2012 
 | 
Verfasst: Mi 11.02.09 22:46 
 
Ja, aber wenn ich das Refresh wegnehme überzeichnet er mir ja alles, und so sehe ich dann ja während des Sortieren nicht die Veränderungen in der PaintBox.
 
	  | Zitat: | 	 		  | Dein Beispiel sieht bei mir ohnehin seltsam aus. Die Titelleiste sieht uralt aus, ich weiß nicht genau warum, aber die neue Oberfläche funktioniert bei deinem Programm nicht. | 	  
Was meinst du damit? Ich habe nichts am Borderstyle verändert.    
_________________ Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  
 | 
 
 |  
jaenicke 
        
 
Beiträge: 19326 
Erhaltene Danke: 1749 
 
W11 x64 (Chrome, Edge) 
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus 
 | 
Verfasst: Mi 11.02.09 23:53 
 
Einloggen, um Attachments anzusehen!
 
 
 | 
 
 |  
 
 
 |