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 20: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 20: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 20: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 21: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 02: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: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 07.02.09 03: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 14: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 14: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 14: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 14: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: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 07.02.09 14:53
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: Sa 07.02.09 14: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 15: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: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 07.02.09 15:49
|
|
Thorsten83
      
Beiträge: 191
Erhaltene Danke: 1
|
Verfasst: Sa 07.02.09 15: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 15: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 21: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: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 11.02.09 21: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 23: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: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 12.02.09 00:53
Einloggen, um Attachments anzusehen!
|
|
|