Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Endlosschleife ? (https://www.delphipraxis.net/48336-endlosschleife.html)

svenwel.de 23. Jun 2005 19:33


Endlosschleife ?
 
Hallo, ich hab folgendes Problem:

Delphi-Quellcode:
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;
Wieso hört diese Schleife nicht auf ?

jbg 23. Jun 2005 19:52

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.

marabu 23. Jun 2005 19:56

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:
const
  epsilon = 0.0001;
begin
  while Abs(Frac(t1) - Frac(t2)) > epsilon do
    ...;
end;
epsilon musst du natürlich geeignet wählen.

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