AGB  ·  Datenschutz  ·  Impressum  







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

Endlosschleife ?

Ein Thema von svenwel.de · begonnen am 23. Jun 2005 · letzter Beitrag vom 23. Jun 2005
Antwort Antwort
Benutzerbild von svenwel.de
svenwel.de

Registriert seit: 8. Apr 2005
Ort: Neunkirchen
23 Beiträge
 
Delphi 7 Personal
 
#1

Endlosschleife ?

  Alt 23. Jun 2005, 20:33
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 ?
Sven W.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Endlosschleife ?

  Alt 23. Jun 2005, 20:52
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Endlosschleife ?

  Alt 23. Jun 2005, 20:56
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
  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 15:02 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