AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim Felderzeugen

Offene Frage von "brutus"
Ein Thema von brutus · begonnen am 21. Sep 2003 · letzter Beitrag vom 29. Sep 2003
Antwort Antwort
brutus

Registriert seit: 12. Sep 2003
45 Beiträge
 
#1

Fehler beim Felderzeugen

  Alt 21. Sep 2003, 19:56
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]
  Mit Zitat antworten Zitat
brutus

Registriert seit: 12. Sep 2003
45 Beiträge
 
#2

Re: Fehler beim Felderzeugen

  Alt 27. Sep 2003, 15:58
Ihr könnt mir ruhig sagen wenn das zu dumm ist was ich frage - man lernt aus fehlern
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Fehler beim Felderzeugen

  Alt 27. Sep 2003, 17:01
Moin Brutus,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

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
FOR a:= 0 TO 8 DO und
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
FOR i:= 0 TO e-1 DO muss es
FOR i:= 0 TO e-2 DO heissen, da Du ansonsten bei
IF f[i]>f[i+1] THEN für i = 9 wieder einen Index ausserhalb des gültigen Bereiches erhältst.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Fehler beim Felderzeugen

  Alt 27. Sep 2003, 17:40
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
brutus

Registriert seit: 12. Sep 2003
45 Beiträge
 
#5

Re: Fehler beim Felderzeugen

  Alt 29. Sep 2003, 14:33
Vielen Dank ich schäme mich richtig für meine Dummheit.
Am liebsten würde ich die ganze Zeit machen.
Ich hab allerdings auch eine Entschuldigung: mein Info Lehrer hat mir nen falsches Struktogram gegeben *schuldaufandereschieben*.
p.s. es funktioniert - Bloß bei Minsort mußte eine 10 statt einer 9 bei
FOR i:= 9 downto a+1 DO hin (ansonsten würde das letzte Element 0 sein)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Fehler beim Felderzeugen

  Alt 29. Sep 2003, 14:41
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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
brutus

Registriert seit: 12. Sep 2003
45 Beiträge
 
#7

Re: Fehler beim Felderzeugen

  Alt 29. Sep 2003, 15:53
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 . . .

p.s. jetzt klappt es !
Der, Die Das,
Wer ,Wie, Was,
Wieso? Weshalb? Warum?
Wer nicht fragt bleibt dumm.
  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 16:33 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