![]() |
Delphi Schleifen-Probleme
Hallo Zusammen.
Ich bin gerade an einem Programm, aber kann meinen Fehler nicht finden. Zu mir, ich bin absoluter Amateur und habe seit einigen Jahren nicht mehr programmiert. Nun bin ich leider dazu gezwungen ein kleines Programm zu schreiben. Im Grund ist es gar nicht so kompliziert. Es geht um Schleifen. Ich habe 5 verschiedene Werte welche eingegeben werden müssen. Dann wird gerechnet, solange bis die ausgerechneten Werte mit vordefinierten Werten übereinstimmen. Hier der Code:
Delphi-Quellcode:
Hier meine Testwerte:
procedure TForm1.Button1Click(Sender: TObject);
var ay, by, cy, l1, l2, f1, lf1, f2, lf2, lges, suche, t: extended; begin ay:= 0; by:= 0; cy:= 0; l1:= 0.1; l2:= 0.1; f1:= strtofloat(edit1.Text); f2:= strtofloat(edit2.Text); lf1:= strtofloat(edit3.Text); lf2:= strtofloat(edit4.Text); lges:= strtofloat(edit5.Text); suche:= (f1+f2)/3; while l1<>lges do begin while l2<>lges do begin ay:= f1*(1-(lf1*2/l1)); by:= -f1 +(f1*lf1*2/l1)+f2+(f1*lf1-f2*(lf2-l1))/l2+f1 ; cy:= -1*(f1*(l1+2*l2)*lf1-f2*l1*(l1-l2-lf2))/(l1*l2); label4.caption:= floattostr(t); t:= t+1; if (ay <= 1.05 * suche) or (ay >= 1.05 * suche) then if (by <= 1.05 * suche) or (by >= 1.05 * suche) then if (by <= 1.05 * suche) or (by >= 1.05 * suche) then begin label1.Caption:= floattostr(ay); label2.Caption:= floattostr(by); label3.Caption:= floattostr(cy); end; l2:= l2 + 0.1; end; l1:= l1 + 0.1; l2:= l1 + 0.1; end; end; end. f1 = 500 f2 = 200 lf1 = 2 lf2 = 5 lges = 10 Leider hängt sich das Programm sofort auf. Label 4 soll mir zeigen, wie oft die Schleife durchlaufen wurde, aber auch hier passiert nicht. Hat jemand eine Lösung? Vielen Dank für Unterstützung! |
AW: Delphie Schleifen-Probleme
Du arbeitest mit Fließkommazahlen, welche i.A. nicht genau genug sind, um diese mit festen Ergebnissen zu vergleichen.
Delphi-Quellcode:
Versuche anstatt
while l1<>lges do
begin while l2<>lges do
Delphi-Quellcode:
...:cat:...
while l1<lges do
begin while l2<lges do P.S.: Die Labels werden sich erst nach der Berechnung neu zeichnen. |
AW: Delphie Schleifen-Probleme
Delphi-Quellcode:
uses
Math; procedure TForm1.Button1Click(Sender: TObject); var ay, by, cy, l1, l2, f1, lf1, f2, lf2, lges, suche: Extended; t: Integer; function IsValueValid(const AValue, ARange: Extended): Boolean; begin Result := (AValue <= ARange) or (AValue >= ARange); end; begin ay := 0; by := 0; cy := 0; l1 := 0.1; l2 := 0.1; f1 := strtofloat(Edit1.Text); f2 := strtofloat(Edit2.Text); lf1 := strtofloat(Edit3.Text); lf2 := strtofloat(Edit4.Text); lges := strtofloat(Edit5.Text); suche := (f1 + f2) / 3; t := 0; while (l1 < lges) do begin while (l2 < lges) do begin ay := f1 * (1 - (lf1 * 2 / l1)); by := - f1 + (f1 * lf1 * 2 / l1) + f2 + (f1 * lf1 - f2 * (lf2 - l1)) / l2 + f1; cy := - 1 * (f1 * (l1 + 2 * l2) * lf1 - f2 * l1 * (l1 - l2 - lf2)) / (l1 * l2); Inc(t); l2 := l2 + 0.1; end; l1 := l1 + 0.1; l2 := l1 + 0.1; end; Label4.Caption := IntToStr(t); if IsValueValid(ay, 1.05 * suche) then Label1.Caption := FloatToStr(ay); if IsValueValid(by, 1.05 * suche) then Label2.Caption := FloatToStr(by); if IsValueValid(cy, 1.05 * suche) then Label3.Caption := FloatToStr(cy); end; |
AW: Delphie Schleifen-Probleme
Zitat:
Vielen Dank, es hat funktioniert! Jedoch habe ich einen kleinen Fehler mit der IF-Anweisung gemacht. Ich will, sobald der Wert zwischen 95%-105% liegt eine IF-Anweisung weiter. Dafür ist mein Ansatz mehr als falsch... Gibt es die Möglichkeit, einfach so einen Bereich zu definieren? |
AW: Delphie Schleifen-Probleme
Fließkommazahlen nie genau auf Gleichheit/Ungleichheit prüfen,
denn Dank der binärbedingen Rundungsfehler kann es knapp vorbei gehn und deine Schleife läuft endlos. z.B. ![]() |
AW: Delphie Schleifen-Probleme
Zitat:
|
AW: Delphi Schleifen-Probleme
Da ja die 95% - 105% offenbar nicht supergenau sein müssen, wäre die Funktion InRange aus der Unit Math ein einfache Lösung (Math müsstest du dann der Uses-Klausel hinzufügen).
Die nimmt auch Fließkommazahlen, und es kommt ja nicht so genau darauf an, dass die Grenze absolut scharf gezogen wird.
Delphi-Quellcode:
If InRange(Wert,Wert * 0.95,Wert * 1.05)
then ... |
AW: Delphi Schleifen-Probleme
Bin ich jetzt vollkommen bescheuert, oder gibt
Delphi-Quellcode:
nicht sowieso IMMER True zurück!?
function IsValueValid(const AValue, ARange: Extended): Boolean;
begin Result := (AValue <= ARange) or (AValue >= ARange); end; MfG Incocnito |
AW: Delphi Schleifen-Probleme
IMHO in der Regel ja. (Wenn die Parameter den Wert NaN o.ä. haben bin ich mir nicht sicher.)
|
AW: Delphi Schleifen-Probleme
Ja tut es, aber das ist halt eins zu eins die Umsetzung aus dem Ursprungsposting.
Ob das sinnvoll ist, obliegt nicht mir. |
AW: Delphi Schleifen-Probleme
|
AW: Delphi Schleifen-Probleme
Zitat:
|
AW: Delphi Schleifen-Probleme
Geht's noch? :shock:
Ich habe bei meinen Beispiel nicht drauf geachtet, was da als Bedingung steht, sondern nur eins zu eins in eine Unterroutine gepackt. Wo ist denn jetzt das Problem? Der Threadersteller hat doch schon selber erkannt, dass es so wie bisher nicht optimal ist und die richtige Lösung mit InRange hast du ihm doch auch schon gegeben. |
AW: Delphi Schleifen-Probleme
Wenn es dir vor freimatz' Hinweis nicht aufgefallen ist -> alles OK.
Deine Antwort klang aber ziemlich anders. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 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