Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehlermeldung "Gleitkommaüberlauf" (https://www.delphipraxis.net/65987-fehlermeldung-gleitkommaueberlauf.html)

Emilio 23. Mär 2006 09:20


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:
 
//. . . 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;
zur Erläuterung:
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

shmia 23. Mär 2006 10:38

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:
type
   TProvisionen = record
      Satz : double;
      LVPAlt : double;
      ...
   end;
Die erleichtert die Strukurierung deiner Aufgabe und man wird nicht von 20 Parametern erschlagen.

Emilio 24. Mär 2006 07:48

Re: Fehlermeldung "Gleitkommaüberlauf"
 
Moin Moin,

Zitat:

Den Code, der den Gleitkommaüberlauf erzeugt, hast du nicht gezeigt.
üps - zu fix den "senden" Button gedrückt ...

hier der Rest:

Delphi-Quellcode:
// *** 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;
und hier die Funktion auf die der Compiler verweist:

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

marabu 24. Mär 2006 07:54

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

Khananka 24. Mär 2006 08:14

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

Emilio 24. Mär 2006 08:20

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

Klaus01 24. Mär 2006 08:32

Re: Fehlermeldung "Gleitkommaüberlauf"
 
variable markieren Ctrl-F5 drücken

Grüße
Klaus

Emilio 24. Mär 2006 08:52

Re: Fehlermeldung "Gleitkommaüberlauf"
 
Danke!

Es kömmt die Meldung: [margeprozneu] undefinierter Bezeichner.
Kommt aber auch bei allen anderen Variablen in der CalcRule03

Klaus01 24. Mär 2006 08:56

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

Emilio 24. Mär 2006 09:06

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 09:35 Uhr.
Seite 1 von 2  1 2      

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