![]() |
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:
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.
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. Würde mich sehr über Hilfe freuen, lg Falldownnice :) |
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.
|
AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
Egal ob ich beide auf 1000 oder 10000 setze, der Fehler bleibt leider bestehen.
|
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.
|
AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
Zitat:
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 |
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; |
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 |
AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
Zitat:
gruss |
AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
Zitat:
|
AW: Quicksort Zugriffsverletzung bei Adresse XX in Modul
Zitat:
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