![]() |
EAccessViolation bei Bubblesort
Hi, ich bekomme folgende Fehlermeldung beim Button-Klick, der Bubblesort eines array of records durchführen soll. Es geht, wie ihr sehen könnt, um einen Abiturrechner, bei dem durch Bubblesort die Noten sortiert werden sollen!
![]()
Delphi-Quellcode:
var
Abiturrechner: TAbiturrechner; List : TStringList; type TNoteneintrag = record Editfeld: string; Notenpunkte: Integer; end; Blg = array[1..10] of TNoteneintrag; implementation uses fAbout; {$R *.dfm} procedure BubbleSort(var List: Blg); var done: boolean; i, n: integer; Dummy: string; begin //n := List[i].Count; n := 5; repeat done := true; for i := 0 to n - 1 do if List[i].Notenpunkte > List[i + 1].Notenpunkte then begin Dummy := List[i].Editfeld; List[i].Notenpunkte := List[i + 1].Notenpunkte; List[i + 1].Editfeld := Dummy; done := false; end; until done; end; procedure TAbiturrechner.Button1Click(Sender: TObject); var noten : Blg; var s : string; var i,u : integer; begin for i := 1 to 5 do begin s := Edit1.Text; u := StrToInt(s); noten[i].Notenpunkte := u; noten[i].Editfeld := s; end; Bubblesort(noten); end; end. |
Re: EAccessViolation bei Bubblesort
Versuch es mal im Bubblesort statt mit
Delphi-Quellcode:
mit
for i := 0 to n - 1 do
Delphi-Quellcode:
Blg ist als Array von 1 bis 10 deklariert, Du willst aber auf Element 0 zugreifen.
for i := Low(List) to High(List) - 1 do
|
Re: EAccessViolation bei Bubblesort
wunderbar, vielen Dank!
|
Re: EAccessViolation bei Bubblesort
nochmal schnell eine andere Frage: Was ist hier falsch in der Schleife?
Delphi-Quellcode:
for i := 1 to 5 do begin
//s := Edit1.Text; s := 'Edit'+IntToStr(i)+'.Text'; |
Re: EAccessViolation bei Bubblesort
s nimmt 5 mal einen anderen Wert an ('Edit1.Text'...'Edit5.Text'. Das macht irgendwie keinen Sinn ;)
|
Re: EAccessViolation bei Bubblesort
Ich denke, was Du beabsichtigst, ist in etwa dies hier:
Delphi-Quellcode:
for i := 1 to 5 do
s := TEdit(FindComponent('Edit' + inttostr(i))).Text; |
Re: EAccessViolation bei Bubblesort
Zitat:
|
Re: EAccessViolation bei Bubblesort
vielen Dank für eure Hilfe. Jetzt funktioniert eigentlich alles, jedoch hab ich jetzt mal probeweise die ersten 2 bubblesort werte ausgeben lassen und die sind jedes mal "3", auch wenn alle Noten "10" sind... :wall:
|
Sortierung von Strings beim Abirechner...
erstmal vielen Dank für eure Hilfe! besonderen Dank an DeddyH!
Bubblesort funktioniert für die Sortierung der Noten schon wunderbar, aber die Fächer werden nicht wirklich sortiert.Anstatt diese so zu sortieren, dass am Ende die Noten wieder zu den Fächern passen, werden die Fächer auch mit den Noten befüllt und sortiert von 1 bis ... Ich kann mir den Fehler nicht wirklich erklären, weil die Sortierung der Noten wunderbar funktioniert und diese durch "StrToInt" eingelesen werden, also kann bei den strings nicht wirklich was falsch sein, oder?
Delphi-Quellcode:
unit fAbiturrechner;
var Abiturrechner: TAbiturrechner; List : TStringList; type TNoteneintrag = record Editfeld: string; Notenpunkte: Integer; end; Blg = array[1..5] of TNoteneintrag; implementation procedure SwapIntegers(var a, b : integer); begin a := a xor b; b := b xor a; a := a xor b; end; procedure BubbleSort(var List: Blg); var done: boolean; i, n: integer; Dummy: string; begin n := High(List); repeat done := true; for i := Low(List) to High(List) - 1 do if List[i].Notenpunkte > List[i + 1].Notenpunkte then begin Dummy := List[i].Editfeld; List[i].Editfeld := List[i+1].Editfeld; List[i + 1].Editfeld := Dummy; SwapIntegers(List[i].Notenpunkte,List[i + 1].Notenpunkte); done := false; end; until done; end; procedure TAbiturrechner.Button1Click(Sender: TObject); var noten : Blg; var s,z : string; var i,u, t : integer; begin FillChar(noten,SizeOf(noten),#0); for i := 1 to 5 do begin s := TEdit(FindComponent('Edit' + inttostr(i))).Text; //<-- string wird z.b. mit "Edit1.Text" gefüllt u := StrToInt(s); //<-- Noten werden eingelesen noten[i].Notenpunkte := u; noten[i].Editfeld := s; end; Bubblesort(noten); for i := Low(noten) to High(noten) do ShowMessage(Format('%d',[noten[i].Notenpunkte])); z := noten[1].Editfeld; //<-- Kontrolle! Hier sollte das Editfeld mit der kleinsten Punktzahl stehen showmessage(z); end; end. |
Re: EAccessViolation bei Bubblesort
Und so?
Delphi-Quellcode:
procedure SwapNoten(var a,b: TNoteneintrag);
var dummy: TNotenEintrag; begin dummy := a; a := b; b := dummy; end; procedure BubbleSort(var List: Blg); var done: boolean; i: integer; begin repeat done := true; for i := Low(List) to High(List) - 1 do if List[i].Notenpunkte > List[i + 1].Notenpunkte then begin SwapNoten(List[i],List[i + 1]); done := false; end; until done; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 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 by Thomas Breitkreuz