Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Quicksort Zugriffsverletzung bei Adresse XX in Modul (https://www.delphipraxis.net/186669-quicksort-zugriffsverletzung-bei-adresse-xx-modul.html)

Falldownnice 22. Sep 2015 07:22

Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Guten Tag liebe Delphi Community! Ich und ein Freund stehen in unserem Informatik Unterricht vor einem Fehler mit einem Quicksort Programm, bei dem auch unser Lehrer uns nicht recht zu helfen weiß..

Problem ist, wie schon im Titel angesprochen, eine Zugriffsverletzung, welche via Popup Fenster beim Sortieren vorher erstellter Zufallszahlen erscheint.
Ich denke ich poste einfach mal den Code (sofern mir das gelingt)
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button3: TButton;
    Button4: TButton;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private-Deklarationen}
  public
    { Public-Deklarationen}
  end;

var i,j,h,n:integer;
   s:string;
    z:array[1..10000] of integer;
  Form1: TForm1;

implementation

{$R *.DFM}
const nn=1000;

procedure TForm1.Button1Click(Sender: TObject);
var zeita,zeitb,zeitOP:integer;
begin
zeita:=gettickcount;
s:=' ';
memo1.clear;
for i:=1 to nn do
              begin
              z[i]:=random(100);
              s:=s+IntToStr(z[i])+',';
              end;

zeitb:=gettickcount;
zeitOP:=zeitb-zeita;
Label2.caption:=IntToStr(zeitOP);

memo1.lines.add(s);
j:=1;
n:=10;


end;

procedure TForm1.Button2Click(Sender: TObject);
var zeita,zeitb,zeitOP:integer;
begin
zeita:=gettickcount;
repeat
j:=j+1;

for i:=1 to j do if z[j]<z[i] then
                              begin
                              h:=z[i];
                              z[i]:=z[j];
                              z[j]:=h;
                              end;
until j=n;

zeitb:=gettickcount;
zeitOP:=zeitb-zeita;
Label1.caption:=IntToStr(zeitOP);

s:=' ';
for i:=1 to n do s:=s+IntToStr(z[i])+',';
memo1.lines.add(s);


end;

procedure Quicksort(var A:array of integer);

procedure Quick_Sort(var A:array of Integer; iLo, iHi: Integer) ;
 var
   Lo, Hi, Pivot, T: Integer;
 begin
   Lo := iLo;
   Hi := iHi;
   Pivot := A[(Lo + Hi) div 2];
   repeat
     while A[Lo] < Pivot do Inc(Lo) ;
     while A[Hi] > Pivot 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 Quick_Sort(A, iLo, Hi) ;
   if Lo < iHi then Quick_Sort(A, Lo, iHi) ;
 end;
begin
Quick_Sort(A, Low(A), High(A)) ;
end;

procedure TForm1.Button3Click(Sender: TObject);
var i,n:integer;
begin


for i := 0 to nn do z[i]:=random(10);

QuickSort(z);

s:=' ';
for i:=1 to nn do s:=s+IntToStr(z[i])+',';
memo1.lines.add(s);



end;

procedure TForm1.Button4Click(Sender: TObject);
var zeita,zeitb,zeitOP:integer;
begin
zeita:=gettickcount;
s:=' ';
memo1.clear;
for i:=1 to nn do
              begin
              z[i]:=random(100);
              s:=s+IntToStr(z[i])+',';
              end;

zeitb:=gettickcount;
zeitOP:=zeitb-zeita;
Label3.caption:=IntToStr(zeitOP);

memo1.lines.add(s);

end;

end.
Die ersten beiden Buttons sind zu vernachlässigen, da sie für eine andere Zählemtode sind, relevant ist nur Quicksort und die buttons 3 und 4.

Würde mich sehr über Hilfe freuen, lg Falldownnice :)

baumina 22. Sep 2015 07:41

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Das Array z ist von 1-10000 definiert. Die for-Schleife zum Befüllen des Arrays bei Button3 geht aber von 0-1000.

Falldownnice 22. Sep 2015 07:48

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Egal ob ich beide auf 1000 oder 10000 setze, der Fehler bleibt leider bestehen.

baumina 22. Sep 2015 07:50

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Das Array beginnt bei 1, befüllt wird es aber ab 0. z[0] gibt's nicht.

EWeiss 22. Sep 2015 07:51

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Zitat:

Zitat von Falldownnice (Beitrag 1316567)
Egal ob ich beide auf 1000 oder 10000 setze, der Fehler bleibt leider bestehen.

Du verstehst nicht!
Hier gibt es den Fehler out of Range

Weil du dein Array von 1 > 10000 definiert hast
und versuchst das Array mit 0 anzusprechen.

i := 0 to nn do z[i]:=random(10);

i = 0 muss aber 1 sein

gruss

Bjoerk 22. Sep 2015 07:52

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
NN ist 1000, High aber 10000. -> Quick_Sort(A, 1, NN)

Und, ob dein Quicksort so richtig ist, kann ich nicht sagen, ich verwende immer den analog TList:
Delphi-Quellcode:
procedure QuickSort(L, R: Integer; var Items: array of Integer);
var
  I, J, K, Pivot, Temp: Integer;
begin
  repeat
    I := L;
    J := R;
    K := (L + R) shr 1;
    Pivot := Items[K];
    repeat
      while Items[I] < Pivot do
        Inc(I);
      while Items[J] > Pivot do
        Dec(J);
      if I <= J then
      begin
        Temp := Items[I];
        Items[I] := Items[J];
        Items[J] := Temp;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if L < J then
      QuickSort(L, J, Items);
    L := I;
  until I >= R;
end;

procedure Sort(var Items: array of Integer; const L, R: Integer);
begin
  QuickSort(L, R, Items);
end;

Falldownnice 22. Sep 2015 07:54

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Oh wow, das war wirklich der ganze Fehler ? :wall:

Danke für die schnelle Hilfe, funktioniert jetzt alles so wie Ich es wollte ! :D

EWeiss 22. Sep 2015 07:58

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Zitat:

bei dem auch unser Lehrer uns nicht recht zu helfen weiß..
Ich glaube ich werde dein Lehrer (Wenn er so etwas nicht sieht) ;)

gruss

baumina 22. Sep 2015 08:05

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Zitat:

Zitat von EWeiss (Beitrag 1316572)
Zitat:

bei dem auch unser Lehrer uns nicht recht zu helfen weiß..
Ich glaube ich werde dein Lehrer (Wenn er so etwas nicht sieht) ;)

gruss

Und ich hatte mich jetzt extra zurückgehalten :angel:

Falldownnice 22. Sep 2015 08:10

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
 
Zitat:

Ich glaube ich werde dein Lehrer (Wenn er so etwas nicht sieht)
Hätte ich nichts gegen bei unserem Lehrer :warn:
Unser Informatik Unterricht ist, nett gesagt, leider nicht mehr ganz auf dem Stand der heutigen Dinge.. :|


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