![]() |
Endlosschleife ?
Hallo, ich hab folgendes Problem:
Delphi-Quellcode:
Wieso hört diese Schleife nicht auf ?
var
Form1: TForm1; t1,t2 : TdateTime; { ...... } procedure TForm1.FormCreate(Sender: TObject); begin t1 :=0; t2 :=0; end; procedure TForm1.SpeedButton4Click(Sender: TObject); var buffT1,buffT2 : TdateTime; i : integer; begin i:=0; { Hier bliebt das Programm kleben } while Frac(t1) <> Frac(t2) do begin t1 := incMinute(t1,15); inc(i); end; label7.Caption:=IntToStr(i); end; |
Re: Endlosschleife ?
Weil TDateTime ein Fließkomma-Datentyp ist und somit nur eine bestimmte Genauigkeit besitzt. Wenn du nun das rechnen mit diesen anfängst, passiert es, dass sich die Werte nie mehr treffen.
Benutze lieber Funktionen wie DecodeTime(), die nicht die gesamte Fließkomma-Auflösung benötigen. |
Re: Endlosschleife ?
Die Abbruchbedingung wird halt nie erfüllt.
Real-Werte solltest du grundsätzlich nie auf Gleichheit bzw. Ungleichheit testen, das ist reine Glückssache. Entweder du nimmst zur Schleifensteuerung Ordinal-werte oder du musst einen Bereichstest durchführen. In der Schule und im Studium rangiert sowas unter epsilon Test.
Delphi-Quellcode:
epsilon musst du natürlich geeignet wählen.
const
epsilon = 0.0001; begin while Abs(Frac(t1) - Frac(t2)) > epsilon do ...; end; In deinem Fall verstehe ich nicht, warum du überhaupt mit Real-Werten operierst. Die Zeiteinheiten sind ja eigentlich Ordinal-Werte. Nur zur Ermöglichung von Zeitarithmetik wurde die Zeit als Teil eines Tages ausgedrückt. Das ist eine sinnvolle Abbildung, aber du brauchst sie doch gar nicht und kannst direkt mit Sekunden rechnen. Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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