AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Quicksort Zugriffsverletzung bei Adresse XX in Modul
Thema durchsuchen
Ansicht
Themen-Optionen

Quicksort Zugriffsverletzung bei Adresse XX in Modul

Ein Thema von Falldownnice · begonnen am 22. Sep 2015 · letzter Beitrag vom 22. Sep 2015
Antwort Antwort
Falldownnice

Registriert seit: 22. Sep 2015
4 Beiträge
 
#1

Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 07:22
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
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 07:41
Das Array z ist von 1-10000 definiert. Die for-Schleife zum Befüllen des Arrays bei Button3 geht aber von 0-1000.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Falldownnice

Registriert seit: 22. Sep 2015
4 Beiträge
 
#3

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 07:48
Egal ob ich beide auf 1000 oder 10000 setze, der Fehler bleibt leider bestehen.
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 07:50
Das Array beginnt bei 1, befüllt wird es aber ab 0. z[0] gibt's nicht.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 07:51
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
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 07:52
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;

Geändert von Bjoerk (22. Sep 2015 um 07:54 Uhr)
  Mit Zitat antworten Zitat
Falldownnice

Registriert seit: 22. Sep 2015
4 Beiträge
 
#7

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 07:54
Oh wow, das war wirklich der ganze Fehler ?

Danke für die schnelle Hilfe, funktioniert jetzt alles so wie Ich es wollte !
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 07:58
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
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 08:05
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
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Falldownnice

Registriert seit: 22. Sep 2015
4 Beiträge
 
#10

AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul

  Alt 22. Sep 2015, 08:10
Zitat:
Ich glaube ich werde dein Lehrer (Wenn er so etwas nicht sieht)
Hätte ich nichts gegen bei unserem Lehrer
Unser Informatik Unterricht ist, nett gesagt, leider nicht mehr ganz auf dem Stand der heutigen Dinge..
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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