Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - [Problem] for schleife spinnt
Pepp3r - So 12.09.10 15:40
Titel: [Problem] for schleife spinnt
Hallo liebe Delphicommunity,
Ich habe mal wieder ein merkwürdiges Problem. In meinem Programm wird ein FOR-Schleife öffter durchlaufen als sie sollte.
Die Schleife wird durchlaufen bei
was ja eigentlich nicht sein dürfte.
Der Quellcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| PeinFilm = ^TeinFilm;
TeinFilm = record cover, titel, jahr, regie, genre, alternativ, kommentar, bewertung, lokal, id: String; next, prev: PeinFilm; end;
TFilm = class(TObject) private first, dummy: PeinFilm; function readFilm(nummer: Word): PeinFilm; public property getFilmData [ nummer: Word ]: PeinFilm read readFilm; end;
function TFilm.readFilm(nummer: Word): PeinFilm; var i: Word; begin dummy := first; for i := 1 to nummer do begin if not (dummy.next = nil) then dummy := dummy.next; else begin result := dummy; exit; end; end; result := dummy; end;
procedure TForm1.Button2Click(Sender: TObject); begin showmessage(Filmliste.getFilmData[1].titel);
end; |
Vllt bin ich zu doof ich weiß es nicht.
Danke für jede Hilfe.
Gruß
Jonas
Marc. - So 12.09.10 15:48
Was auch korrekt ist. Die Schleife wird einmal mit dem Index i = 1 durchlaufen. Analog dazu wird die Schleife for i := 1 to 2 zwei Mal durchlaufen. Entsprechend mit den Indizes 1 und 2. :)
Grüße
Marc
Pepp3r - So 12.09.10 15:53
Meiner Erfahrung nach wird die Schleife so oft durchlaufen bis for und to den selben Wert haben. Demnach müsste die schleife garnicht durchlaufen werden?!?
mkinzler - So 12.09.10 15:59
Dann müsstest du eine While-Schleife nehmen
Pepp3r - So 12.09.10 16:00
Also stimmts, dass for i:=1 to 1 genau einmal durchlaufen wird?
mkinzler - So 12.09.10 16:01
Ja.
elundril - So 12.09.10 16:02
Anscheinend richten sich die Delphi-Entwickler nicht nach deiner Erfahrung. Meiner Erfahrung nach ist die Abbruchbedingung immer Grenze < Laufvariable und nicht <=.
lg elundril
Tranx - So 12.09.10 16:03
Leider funktioniert das nicht so, wie Du willst.
For i := a to x do ...
läuft i solange durch bis i = x ist. also 1x, falls x und a = 1 sind. Wilst Du die Schleife nie durchlaufen, muss x kleiner als a sein :
Dann muss Du schreiben:
For i := 1 to nummer -1 do ...
Pepp3r - So 12.09.10 16:06
Okay ich danke euch. :)
Edit:// richtige schleifenwahl war hier die lösung, mit for i:=1 to nummer-1 gabs ebenfalls probleme. mit der while schleife klappts nun.
Habe nun noch zwei weitere Fragen für die ich einen Thread spare:
1.: Gibt es für Funktionen einen Resultbefehl der einen exit beinhaltet?
2.: Gibt es in Delphi ein this-keywort wie bei java?
Marc. - So 12.09.10 16:13
Auch ein Blick in den Debugger-Code hätte geholfen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| 00464808 B801000000 mov eax,$00000001 0046480D 90 nop 0046480E 48 dec eax 0046480F 75FC jnz $0046480d 00464811 C3 ret |
Gruß
Marc
mkinzler - So 12.09.10 16:27
| Zitat: |
| 1.: Gibt es für Funktionen einen Resultbefehl der einen exit beinhaltet? |
Nein.
| Zitat: |
| 2.: Gibt es in Delphi ein this-keywort wie bei java? |
Ja: self
Pepp3r - So 12.09.10 16:44
mkinzler hat folgendes geschrieben : |
| Zitat: | | 1.: Gibt es für Funktionen einen Resultbefehl der einen exit beinhaltet? | Nein.
| Zitat: | | 2.: Gibt es in Delphi ein this-keywort wie bei java? | Ja: self |
self macht soweit ich weiß nicht die variablen im prozedurkopf sichtbar?!
elundril - So 12.09.10 16:48
Darf ich dich auf die Regel "Neue Frage, neues Topic" hinweisen. Ist für die Übersicht besser und auch falls jemand die gleiche Frage mal haben sollte, erleichtert diese Regel die Suche.
lg elundril
Martok - So 12.09.10 17:11
Hallo,
Auch nochmal von offizieller Stelle:
bitte erstelle für jede deiner Fragen ein separates Topic, da die Diskussion mehrerer Fragen in einem Topic für gewöhnlich für Verwirrung und Durcheinander sorgt. Daher:
*geschlossen*
Die bereits gegeben Antwort lasse ich mal drin, sollten weitere Fragen sein, erstelle bitte getrennte Themen dazu.
Viele Grüße,
Martok
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!