Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler beim Felderzeugen (https://www.delphipraxis.net/9247-fehler-beim-felderzeugen.html)

brutus 21. Sep 2003 19:56


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:
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;
Hier der Minsort Quelltext:
Delphi-Quellcode:
 
procedure 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;
Und hier Bubble mit While
Delphi-Quellcode:
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;
Bitte helft mir ! ! ! ! :(

[edit]Ich hab mir das Programm noch mal angesehen es wird jeweils ein Feld sortiert und das nächste nur teilweise[/edit]

brutus 27. Sep 2003 15:58

Re: Fehler beim Felderzeugen
 
Ihr könnt mir ruhig sagen wenn das zu dumm ist was ich frage - man lernt aus fehlern :wall:

Christian Seehase 27. Sep 2003 17:01

Re: Fehler beim Felderzeugen
 
Moin Brutus,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Zitat:

Zitat von Brutus
Ihr könnt mir ruhig sagen wenn das zu dumm ist was ich frage - man lernt aus fehlern

Es gibt keine dummen Fragen, nur dumme Antworten.
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:
FOR a:= 0 TO 8 DO
und
Delphi-Quellcode:
FOR i:= a+1 TO 9 DO
dann wäre zumindest schon einmal das Problem mit den falschen Indizes vom Tisch.

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:
FOR i:= 0 TO e-1 DO
muss es
Delphi-Quellcode:
FOR i:= 0 TO e-2 DO
heissen, da Du ansonsten bei
Delphi-Quellcode:
IF f[i]>f[i+1] THEN
für i = 9 wieder einen Index ausserhalb des gültigen Bereiches erhältst.

Christian Seehase 27. Sep 2003 17:40

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

brutus 29. Sep 2003 14:33

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:
FOR i:= 9 downto a+1 DO
hin (ansonsten würde das letzte Element 0 sein)

Christian Seehase 29. Sep 2003 14:41

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 ;-)

brutus 29. Sep 2003 15:53

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