Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prozedur anhalten, um Zwischenergebnisse zu sehen (https://www.delphipraxis.net/37669-prozedur-anhalten-um-zwischenergebnisse-zu-sehen.html)

Futzel 8. Jan 2005 15:39


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:
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.
Zur Erklärung noch ein Screenshot meiner Anwendung im Anhang.
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.

Oxmyx 8. Jan 2005 15:50

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.

Futzel 8. Jan 2005 15:53

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Im Programm drin kann man das nicht machen? Zur Diagnose?

Oxmyx 8. Jan 2005 15:58

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.

Futzel 8. Jan 2005 16:00

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Danke, ich schau mir das heute Abend nochmal an!

arbu man 8. Jan 2005 16:01

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Setzt einfach showmessage zum testen rein

Futzel 8. Jan 2005 18:56

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Was ist eine Showmessage?

Die Muhkuh 8. Jan 2005 19:02

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Hi,

Delphi-Quellcode:
ShowMessage('Hallo, ich bin eine MessageBox');

Futzel 8. Jan 2005 19:04

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Vielen Dank!

Die Muhkuh 8. Jan 2005 19:07

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Gern geschehen :roteyes:

Futzel 8. Jan 2005 20:18

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button3: TButton;
    procedure QuickSort(A: array of integer; iLo, iHi: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    {----}
  public
    {----}
  end;

var
  Form1: TForm1;
  arr: array [0..10] of integer;
  a: array of integer;
  iLo, iHi: Integer;
implementation

{$R *.dfm}

procedure TForm1.QuickSort(A: array of integer; iLo, iHi: Integer);
var
  Lo, Hi, Mid, T: Integer;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := A[(Lo + Hi) div 2];
    ShowMessage(IntToStr(Mid)+' '+IntToStr(Hi)+' '+IntToStr(Lo));
    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;
    if Hi > iLo then QuickSort(A, iLo, Hi);
    if Lo < iHi then QuickSort(A, Lo, iHi);
    end;
   
procedure TForm1.Button2Click(Sender: TObject);
var I: Integer;
begin
QuickSort(arr,Low(arr),High(arr));
 for I:=Low(arr) to High(arr) do Listbox2.Items.Add(IntToStr(arr[I]));
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;
Hallo,

kann mir nochmal jemand helfen? Es wird jetzt überhaupt nicht mehr sortiert, aber ich kann die Showmessages zwischendrin abfangen! Ausgabe ist die gleiche wie unsortiert!

Futzel 8. Jan 2005 22:07

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Ich weiß auch nicht, was ich falsch mache, aber vorhin ging es noch und nun habe ich es soweit gebracht, dass es nicht mehr geht. Muss in die Listbox nicht das Array 'A'? Weil das 'arr' ist ja das gleiche wie vorher, oder?

Sharky 9. Jan 2005 07:39

Re: Prozedur anhalten, um Zwischenergebnisse zu sehen
 
Hai Futzel,

wenn ich das richtig sehe hast Du bei deinen Änderungen das VAR bei der Methoden deklaration herausgenommen.
Dadurch werden die Änderungen die deine Quicksort-Funktion macht nicht an dein Array "arr" zurückgegeben.

Also einfach mal so ändern ->

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons;

type
  TForm1 = class(TForm)
.
.
    procedure QuickSort(VAR A: array of integer; iLo, iHi: Integer);
.
.
procedure TForm1.QuickSort(VAR A: array of integer; iLo, iHi: Integer);
.
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz