![]() |
Prozedur anhalten, um Zwischenergebnisse zu sehen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe DPler,
ich bin gerade dabei, dass QuickSort Sortierverfahren zu programmieren. Damit ich es besser nachvollziehen kann, würde ich gerne den Algorithmus nach jeder Blocksortierung anhalten, Informationen auslesen und dann weiter laufen lassen.
Delphi-Quellcode:
Zur Erklärung noch ein Screenshot meiner Anwendung im Anhang.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) ListBox1: TListBox; ListBox2: TListBox; Button1: TButton; Button2: TButton; Label1: TLabel; Label2: TLabel; Panel1: TPanel; Label3: TLabel; LabeledEdit1: TLabeledEdit; LabeledEdit2: TLabeledEdit; LabeledEdit3: TLabeledEdit; ListBox3: TListBox; Label4: TLabel; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; arr: array[0..100] of integer; A: array of Integer; geton: Boolean; iLo, iHi, Lo, Hi, Mid, T: Integer; implementation {$R *.dfm} procedure QuickSort(var A: array of Integer; iLo, iHi: Integer); begin Lo := iLo; Hi := iHi; Mid := A[(Lo + Hi) div 2]; LabeledEdit1.Text := IntToStr(Hi); LabeledEdit2.Text := IntToStr(Lo); LabeledEdit3.Text := IntToStr(Mid); repeat while A[Lo] < Mid do Inc(Lo); while A[Hi] > Mid do Dec(Hi); if Lo <= Hi then begin T := A[Lo]; A[Lo] := A[Hi]; A[Hi] := T; Inc(Lo); Dec(Hi); end; until Lo > Hi; geton := false; end; procedure TForm1.Button2Click(Sender: TObject); begin QuickSort(arr,Low(arr),High(arr)); end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin Randomize; for I:=Low(arr) to High(arr) do arr[I]:=Random(100); for I:=Low(arr) to High(arr) do Listbox1.Items.Add(IntToStr(arr[I])); end; procedure TForm1.Button3Click(Sender: TObject); begin if Hi > iLo then QuickSort(A, iLo, Hi); if Lo < iHi then QuickSort(A, Lo, iHi); end; procedure TForm1.Button4Click(Sender: TObject); var I: Integer; begin for I:=Low(arr) to High(arr) do Listbox2.Items.Add(IntToStr(arr[I])); end; end. Zunächst wird durch Füllen (Button1) das Array 'arr' mit Zahlen zwischen 0 und 100 befüllt und in der Listbox1 ausgegeben. Um den Sortierungsvorgang zu starten, klickt man auf Start (Button2), wobei die Zahlen schon in größer und kleiner als den Mittelwert sortiert werden (ihr kennt das Verfahren ja). Jetzt soll die erste Diagnose ausgegeben werden mit Mittelwert, Höchstwert und Lowwert. Wenn ich das mal hinbekommen habe, muss man dann immer auf Weiter (Button 3) klicken, bis zum Ende und dann wird die Liste sortiert über Button4 ausgegeben. Nun mein eigentliches Problem: Es kommt nach dem ersten Mal auf 'weiter' klicken, eine Zugriffsverletztung 'EAccessViolation'. Außerdem findet er bei diesem Block einen Fehler: LabeledEdit1.Text := IntToStr(Hi); LabeledEdit2.Text := IntToStr(Lo); LabeledEdit3.Text := IntToStr(Mid); Das sei alles ein Undefinierter Bezeichner! kann mir jemand bei meinem Problem helfen? PS: Die temporäre Liste erst einmal ignorieren. |
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
1. Klicke links neben die Zeile, bei der du die Programmausführung anhalten willst. Die Zeile färbt sich daraufhin rot. Das ist ein Haltepunkt.
2. Führe das Programm aus. Wenn die Programmausführung an einen Haltepunkt gelangt, hält der Debugger die Ausführung an, und du kannst die Werte der Variablen einsehen, wenn du mit dem Mauszeiger über den Variablennamen fährst. |
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
Im Programm drin kann man das nicht machen? Zur Diagnose?
|
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
Nein. Du kannst dir aber selbstverständlich eine Funktion schreiben, die immer nur einen Schritt des Quicksort-Algorithmus ausrechnet.
Der Fehler "Undefinierter Bezeichner" kommt übrigens, weil procedure QuickSort(var A: array of Integer; iLo, iHi: Integer); bei dir keine Methode der Klasse TForm1 ist, und deshalb keine Ahnung hat, was LabeledEdit1, etc. sein soll. Mach die Funktion doch einfach zur Methode der Klasse. Und wenn du schon dabei bist, schreibe alle Variablen in den private-Teil der Klasse. |
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
Danke, ich schau mir das heute Abend nochmal an!
|
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
Setzt einfach showmessage zum testen rein
|
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
Was ist eine Showmessage?
|
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
Hi,
Delphi-Quellcode:
ShowMessage('Hallo, ich bin eine MessageBox');
|
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
Vielen Dank!
|
Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
Gern geschehen :roteyes:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz