![]() |
Fehlermeldung "Gleitkommaüberlauf"
Moin allerseits,
ich erhalte die Fehlermeldung "Gleitkommaüberlauf" in der markierten Prozedur und habe keine Idee, woher sie kommt, warum und v.a. wie ich sie wegbekomme:
Delphi-Quellcode:
zur Erläuterung://. . . wenn noch kein neuer LVP eingetragen wurde if EditCurr2.Value = 0 then begin CalcRule01(ekneu, zuschlag, BPAlt, LVPAlt, MwSt, BruttoLVPAlt, MargeEAlt, ProvSatz, ProvLVPAlt, bpneu, bpaender, lvpneu, lvpaender, bruttolvpneu, bruttolvpaender, margeEneu, margeEaender, margeprozneu, margeprozaender, provlvpneu, provlvpaender); end else // . . . wenn ein LVP bereits vorhanden ist if EditCurr2.Value > 0 then case Form2.ShowModal of mryes: // Werte mit Standard-KalkluationsRegel überschreiben CalcRule01(ekneu,zuschlag,BPAlt,LVPAlt,MwSt,BruttoLVPAlt,MargeEAlt,ProvSatz, ProvLVPAlt,bpneu,bpaender,lvpneu,lvpaender,bruttolvpneu,bruttolvpaender,margeEneu, margeEaender,margeprozneu,margeprozaender,provlvpneu,provlvpaender); mrno: // nicht überschreiben CalcRule03(ekneu,zuschlag,lvpneu,ProvSatz,MargeEAlt,ProvLVPAlt,bpneu,margeEneu, // hier kömmt der Fehler und zwar margeprozneu,provlvpneu,margeEaender,margeprozaender,provlvpaender); // genau bei der Position 'margeprozneu' mrcancel: exit; end; EditCurr7.Value := bpneu; EditCurr2.Value := lvpneu; EditCurr3.Value := bruttolvpneu; EditCurr4.Value := margeEneu; EditCurr5.Value := margeprozneu; EditCurr6.Value := provlvpneu; auf meiner Form sind mehrere Edits vom Typ TEditCurr (Extended), in welche der User Werte eingeben kann und Berechnungen mit diesen Werten durchführen kann. Hier speziell: der User gibt einen neuen Verkaufspreis für einen Artikel ein; anschließend einen neuen Einkaufspreis in das dafür vorgesehene Feld. Nach Auswahl des Gemeinkostenzuschlagssatzes "stellt das Programm fest", dass die Standard-Kalkulationsregel nicht ohne Rückfrage angewendet werden kann (siehe Punkt: // wenn ein LVP bereits vorhanden ist). Also öffnet sich ein Form modal und bietet ja, nein und abbrechen. Bei Wahl auf ja, wird die Standardregel angewendet (eingegebene Werte überschrieben), bei nein, soll mit den User-Werten gerechnet werden - und hier klömmts! Hat jemand nen Tipp in welcher Ecke des Dunkels sich ein Streichholz verbirgt? VG Emilio |
Re: Fehlermeldung "Gleitkommaüberlauf"
Den Code, der den Gleitkommaüberlauf erzeugt, hast du nicht gezeigt.
Aber ich gebe dir ein Tip zu deinen Variablen: Du solltest zusammenhängende Werte in einem Record speichern und übergeben.
Delphi-Quellcode:
Die erleichtert die Strukurierung deiner Aufgabe und man wird nicht von 20 Parametern erschlagen.
type
TProvisionen = record Satz : double; LVPAlt : double; ... end; |
Re: Fehlermeldung "Gleitkommaüberlauf"
Moin Moin,
Zitat:
hier der Rest:
Delphi-Quellcode:
und hier die Funktion auf die der Compiler verweist:
// *** Berechnung der Parameter, wenn ein ekneu und ein lvpneu eingegeben wurde ***
procedure CalcRule03(ekneu, zuschlag,lvpneu,ProvSatz, MargeEAlt, ProvLVPAlt : Extended; var bpneu, margeEneu, margeprozneu, provlvpneu, margeEaender, margeprozaender, provlvpaender: Extended); begin bpneu := f_bpneu(ekneu, zuschlag); margeEneu := f_margeEneu(ekneu, lvpneu); margeprozneu := f_margeprozneu(ekneu, lvpneu); provlvpneu := f_provlvpneu(bpneu, lvpneu, ProvSatz); margeEaender := f_margeEaender(margeEneu, MargeEAlt); margeprozaender := f_margeProzaender(margeEneu, MargeEAlt); provlvpaender := f_provlvpaender(provlvpneu, ProvLVPAlt); end;
Delphi-Quellcode:
function f_margeprozneu(ekneu: Extended; lvpneu: Extended): Extended;
begin Result := (1-(ekneu/lvpneu))*100; end; Warum er nur bei "nein" an dieser Stelle hängenbleibt ? VG Emilio |
Re: Fehlermeldung "Gleitkommaüberlauf"
Hallo Emilio,
hast du das Programm denn mal in der Funktion f_margeprozneu() angehalten um die Variablen zu inspizieren? Grüße vom marabu |
Re: Fehlermeldung "Gleitkommaüberlauf"
Moin,
kann mich dem Tip von marabu nur anchliessen, mein erster Gedanke bei sowas ist immer eine Division durch Null - hiesse in Deinem Fall, dass lvpneu auf "0" überprüft werden müsste. Hth, Khananka |
Re: Fehlermeldung "Gleitkommaüberlauf"
Hi Marabu,
nein, da ich auf diese Idee nicht gekommen bin und (bitte nicht schlagen!) ich nicht weiß wie ich, wie ich die Variable inspizieren könnte. Angehalten an diesem Punkt habe ich, aber dann? @Khananka, Danke für Deinen Hinweis. Dieser Gedanke ist mir auch gekommen. Aber wie könnte ich der Prozedur den Wert für LVP (also lvpneu := eDitCurrX.Value) mitteilen? VG Emilio |
Re: Fehlermeldung "Gleitkommaüberlauf"
variable markieren Ctrl-F5 drücken
Grüße Klaus |
Re: Fehlermeldung "Gleitkommaüberlauf"
Danke!
Es kömmt die Meldung: [margeprozneu] undefinierter Bezeichner. Kommt aber auch bei allen anderen Variablen in der CalcRule03 |
Re: Fehlermeldung "Gleitkommaüberlauf"
du kannst nicht die Prozedure überwachen,
die Variablen kannst Du überwachen Result := (1-(ekneu/lvpneu))*100;
Delphi-Quellcode:
;
function f_margeprozneu(ekneu: Extended; lvpneu: Extended): Extended;
begin <- den Breakpoint setzen Result := (1-(ekneu/lvpneu))*100; end dann mit F7 oder F8 weitergehen Grüße Klaus |
Re: Fehlermeldung "Gleitkommaüberlauf"
ah jetzt ja!
strange - der lvpneu hat einen Wert von 0,20981 ... e-4933 mit so einem Wert könnt ich auch nicht rechnen. Aber woher kommt denn der? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:02 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 by Thomas Breitkreuz