Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi programmfehler bei selectionsort (https://www.delphipraxis.net/103225-programmfehler-bei-selectionsort.html)

ichtyp 12. Nov 2007 16:36


programmfehler bei selectionsort
 
hiho
ich soll ein programm schreiben welches die geschwindigkeit von sortieralgorythmen vergleicht.
bis jetzt bin ich am teil von selection sort.
das programm bringt, wenn ichs so starte, immer den folgenden fehler :

Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project2.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 004529AA in Modul 'Project2.exe'. Lesen von Adresse 00D88000'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK  Hilfe  
---------------------------
glaube das liegt daran, das man das selectionsort mehrmals hinterinander laufen lässt. aber warum genau ?


wenn ich was vergesssen hab zu erwähnen dann sagt bitte bescheid, wollte nicht 3 seiten text posten :)

danke schonmal ! lg ichtyp



Delphi-Quellcode:
var
  Form1: TForm1;
  schritte, anzahl:integer; // die editfelder variablen
  c,t1,t2:tLargeInteger; // für die zeitmessung
  time: extended;
  x: array of integer;
  a,b,tmp:integer;        // tausch procedur variablen

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;                    // "würfeln"
queryperformancefrequency(c); // aktuelle zeit holen
memo1.Lines.clear;            // memofelder leeren
memo2.Lines.clear;
memo3.Lines.clear;
memo4.Lines.clear;
memo5.Lines.clear;
memo6.lines.Clear;

end;



// ------ Selection sort ----------------------------//
procedure TForm1.Button1Click(Sender: TObject);
var h,i,j,k,t :integer;
begin
  memo5.Lines.clear;
  memo6.lines.Clear;
  anzahl:=strtoint(edit1.text);                        // variablen einlesen
  schritte:=strtoint(edit2.text);
  setlength (x, anzahl);                               // array länge zuweisen
  for i:=1 to anzahl do begin x[i]:=random(anzahl)+1 end;// das array befüllen mit zufallswerten
if checkbox1.Checked then                               // wenn checkbox an , dann zahlen ausgeben
    begin
     for i:=1 to anzahl do memo5.lines.add(inttostr(x[i]))
    end;



for h:=1 to schritte do
begin anzahl:=anzahl*i;
       queryperformancecounter(t1);                          // Zeitmessung start !

 for k:=1 to anzahl do
  begin
   for j:= k+1 to anzahl do begin
    if x[j] < x[k] then begin
    t:=x[j]; x[j]:=x[k]; x[k]:=t; end
    end
   end ;

 if checkbox1.Checked then                                   // wenn checkbox an , dann zahlen ausgeben (sortiert, im feld daneben)
    begin
     for i:=1 to anzahl do memo6.lines.add(inttostr(x[i]))
    end;



queryperformancecounter(t2);        // Zeitmessung stop !
 time:=(t2-t1)/c ;
memo1.lines.add(floattostr(time));

end;




end;
// ===================================================== //

shmia 12. Nov 2007 16:55

Re: programmfehler bei selectionsort
 
Mach doch mal einen Breakpoint auf procedure TForm1.FormCreate.
Wird dieser Breakpoint erreicht oder kommt die Exception schon vorher ?
Was wird angezeigt, wenn du Strg+Alt+S drückst ? (=Ansicht -> Debugfenster->Aufrufstack)

ichtyp 12. Nov 2007 17:00

Re: programmfehler bei selectionsort
 
der fehler tritt erst beim click auf den button auf, falls du das meinst.

Klaus01 12. Nov 2007 17:05

Re: programmfehler bei selectionsort
 
Delphi-Quellcode:
if checkbox1.Checked then                               // wenn checkbox an , dann zahlen ausgeben
  begin
     for i:=1 to anzahl do memo5.lines.add(inttostr(x[i]))
  end;
x ist eine dynamisches Array und startet bei 0 und endet bei anzahl -1.

Grüße
Klaus

shmia 12. Nov 2007 17:07

Re: programmfehler bei selectionsort
 
Na dann einen Breakpoint auf die 1. Anweisung in procedure TForm1.Button1Click() setzen, Programm starten und den Button drücken.
Dann mit F8 im Einzelschritt weiter, bis die Exception kommt.
Du kannst auch einen 2. Breakpoint in die Mitte der Procedure setzen und das Programm mit F9 weiterrennen lassen.
Mit dieser Methode kannst du den Befehl einkreisen, der die Exception auslöst.

ichtyp 12. Nov 2007 17:17

Re: programmfehler bei selectionsort
 
den breakpoint erstell ich mit f5 , oder ?

oh, ich denke ich habs hinbekommen :)
hab die länge des arrays jetzt in der ersten schleife nochmal definiert, sonst kam das nicht hin ..

danke für die antworten ! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 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