![]() |
Fehler beim Felderzeugen
Hallo erstmal an alle.
Ich hab einen Fehler bei einem kleinen Programm: eigentlich sollte ein zufällig erzeugtes Feld ausgegeben werden dass dann mit Bubblesort (durch While) oder Minsort sortiert wird allerdings wird immer dass erste mal wenn ich auf die button klicke das Feld nicht richtig sortiert. Wenn ich aber ein neues Feld erzeuge wird es richtig sortiert. Kann mir irgendjemand helfen??? Hier wird das Feld erzeugt (müßte eigentlich richtig sein?!)
Delphi-Quellcode:
Hier der Minsort Quelltext:
procedure TForm1.Button4Click(Sender: TObject);
var i: integer; begin for i:= 0 to 9 do begin f[i]:=(random(49)+1); stringgrid1.cells[i,0]:=inttostr(f[i]) end; end;
Delphi-Quellcode:
Und hier Bubble mit Whileprocedure TForm1.Button2Click(Sender: TObject); VAR i, a, u, m :integer; BEGIN FOR a:= 1 TO 9 DO BEGIN u:=a; FOR i:= a+1 TO 10 DO IF f[i] < f[u] THEN BEGIN u:=i; m:=f[u]; f[u]:=f[a]; f[a]:=m; END; END; FOR i:= 1 TO 10 DO stringgrid1.cells[i-1,0]:= inttostr(f[i]); END;
Delphi-Quellcode:
Bitte helft mir ! ! ! ! :(
procedure TForm1.Button8Click(Sender: TObject);
var i,m,e: integer; BEGIN e:= 10; WHILE e>1 DO BEGIN FOR i:= 0 TO e-1 DO BEGIN IF f[i]>f[i+1] THEN BEGIN m:=f[i]; f[i]:=f[i+1]; f[i+1]:=m; END; END; e:= e-1; END; FOR i:= 0 TO 9 DO stringgrid1.cells[i,0]:=inttostr(f[i]) END; [edit]Ich hab mir das Programm noch mal angesehen es wird jeweils ein Feld sortiert und das nächste nur teilweise[/edit] |
Re: Fehler beim Felderzeugen
Ihr könnt mir ruhig sagen wenn das zu dumm ist was ich frage - man lernt aus fehlern :wall:
|
Re: Fehler beim Felderzeugen
Moin Brutus,
erst einmal herzlich willkommen hier in der Delphi-PRAXiS. Zitat:
Wenn man irgendetwas nicht weiss, oder sieht, dann ist das nun einmal so. Das passiert ja nun wirklich jedem. So, ich hab' mir mal Deine Sourcen angesehen, und ausprobiert. (ich hab' mir die Daten nur mal senkrecht ausgeben lassen) Was mir dabei als erstes augefallen ist: Beim Minsort bekam ich als Ergebnis u.a. eine -1 angezeigt, was ja nun wirklich nicht sein kann. Der Bubblesort sortierte zwar auf den ersten Blick richtig, aber enthielt auch einen Wert, der in den Ursprungsdaten gar nicht enthalten war. Der Minsort enthält auf jeden Fall schon einmal bei der Ausgabe der Daten einen Fehler: Die Schleife muss von 0 bis 9 und nicht von 1 bis 10 laufen, da ja f von 0 bis 9 deklariert ist, Du aber die Indizes von 1 bis 10 ansprichst, und somit bei f[10] den Wert ausgegeben bekommst, der zufällig gerade an der Speicherstelle steht. Gemeinerweise führt das nicht zwangsläufig zu einem Fehler, wenn die Bereichsprüfung (Compiler Direktive $R) nicht aktiviert ist. Anschliessend erhielt ich aber immer noch einen negativen Wert in der Liste, was darauf hinwies, dass irgendwo immer noch ein Index verwendet wird, der ausserhalb des zulässigen Bereiches liegt. Beim Minsort solltest Du, als erster Ansatz, mal die Schleifen korrigieren
Delphi-Quellcode:
und
FOR a:= 0 TO 8 DO
Delphi-Quellcode:
dann wäre zumindest schon einmal das Problem mit den falschen Indizes vom Tisch.
FOR i:= a+1 TO 9 DO
Den Minsort Algorithmus kenne ich jetzt leider nicht. Könntest Du den mal beschreiben? Vielleicht hätte ich dann auch eine Chance, festzustellen, was bei der Umsetzung schiefgegangen ist. Auffällig ist nur, dass mehrmaliges Ausführen des Minsort irgendwann zu einer korrekten Sortierung führt. Beim Bubblesort hab' ich den Fehler gefunden: Statt
Delphi-Quellcode:
muss es
FOR i:= 0 TO e-1 DO
Delphi-Quellcode:
heissen, da Du ansonsten bei
FOR i:= 0 TO e-2 DO
Delphi-Quellcode:
für i = 9 wieder einen Index ausserhalb des gültigen Bereiches erhältst.
IF f[i]>f[i+1] THEN
|
Re: Fehler beim Felderzeugen
Moin Brutus,
den Fehler beim Minsort hab' ich inzwischen auch gefunden: Die Schleifen müssen rückwärts laufen, da man bei diesem Verfahren ja je Durchlauf immer den grössten Wert ans Ende packt. Ersatzweise könntest Du das Verfahren wahrscheinlich auch umdrehen, also immer den kleinsten Wert je Durchlauf an den Anfang legen. Mit diesen Schleifen läuft es:
Delphi-Quellcode:
FOR a:= 8 downto 0 DO
// und FOR i:= 9 downto a+1 DO |
Re: Fehler beim Felderzeugen
Vielen Dank :oops: ich schäme mich richtig für meine Dummheit.
Am liebsten würde ich die ganze Zeit :wall: :wall: :wall: :wall: machen. :mrgreen: Ich hab allerdings auch eine Entschuldigung: mein Info Lehrer hat mir nen falsches Struktogram gegeben *schuldaufandereschieben*. p.s. es funktioniert :party: :party: - Bloß bei Minsort mußte eine 10 statt einer 9 bei
Delphi-Quellcode:
hin (ansonsten würde das letzte Element 0 sein)
FOR i:= 9 downto a+1 DO
|
Re: Fehler beim Felderzeugen
Moin Brutus,
das mit der 10 kann aber nicht sein. Dein Feld F hat die Indizes 0 bis 9. Wenn Du jetzt eine 10 einträgst, sprichst Du wieder ein Element der Tabelle an, dass ausserhalb des zulässigen Bereiches liegt. Klammere die Funktion einfach mal in {$R+}/{$R-} ein (sollte man nur während der Testphase machen), und schau Dir die Exception an ;-) |
Re: Fehler beim Felderzeugen
bei 9 wird der erste Wert weggelassen und dafür hinten eine 0 geschrieben d.h. die ausgabe ist im stringgrid um eins nach links verschoben - wenn ich das jetzt schreibe wird mir klar dass ich die ausgabe im stringgrid falsch habe . . . :wall:
p.s. jetzt klappt es ! :spin2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 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