AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language "invalid floating point operation" finde den Fehler nicht
Thema durchsuchen
Ansicht
Themen-Optionen

"invalid floating point operation" finde den Fehler nicht

Ein Thema von St0rmhunter · begonnen am 2. Nov 2011 · letzter Beitrag vom 14. Nov 2011
Antwort Antwort
Seite 1 von 2  1 2      
St0rmhunter

Registriert seit: 20. Aug 2011
24 Beiträge
 
#1

"invalid floating point operation" finde den Fehler nicht

  Alt 2. Nov 2011, 14:43
Delphi-Version: 7
Ich habe ein seltsames Problem, wie der Titel schon sagt beim Klicken auf den Button2 kommt immer die Fehlermeldung "Invalid floating point operation".
Meine Variablen:
Delphi-Quellcode:
var
  Form1: TForm1;
  i,j: Integer;
  Bst,b: Extended;

Das hier ist der Quellcode zu Button2:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  memo2.text:='';
  for i:=1 to length(memo1.text) do
  begin
    Bst:=strtofloat(memo1.text[i]+memo1.text[i+1]+memo1.text[i+2]);
    b:=Bst;
    for j:=2 to strtoint(edit3.text) do
    begin
      Bst:=Bst*b;
    end;
    Bst:=Bst - (Trunc(Bst / strtoint(edit2.text)) * strtoint(edit2.text));
    memo2.text:=memo2.text + chr(strtoint(floattostr(Bst)));
  end;
end;
Der Fehler scheint in dieser Zeile zu sein,Bst:=Bst - (Trunc(Bst / strtoint(edit2.text)) * strtoint(edit2.text)); denn ohne sie läuft das Programm ohne Fehlermeldung.

Jedoch das seltsame ist die ZeileBst:=Bst - (Trunc(Bst / strtoint(edit2.text)) * strtoint(edit2.text)); habe ich auch bei Button1 verwendet, jedoch kommt da keine Fehlermeldung

Quellcode Button1:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  memo2.text:='';
  for i:=1 to length(memo1.text) do
  begin
    Bst:=ord(memo1.text[i]);
    b:=Bst;
    for j:=2 to strtoint(edit1.text) do
    begin
      Bst:=Bst*b;
    end;
    Bst:=Bst - (Trunc(Bst / strtoint(edit2.text)) * strtoint(edit2.text));
    if Bst <100 then
    begin
      if Bst < 10 then
      begin
        memo2.text:=memo2.text + '00' + floattostr(Bst);
      end
      else
      begin
        memo2.text:=memo2.text + '0' + floattostr(Bst);
      end;
    end
    else
    begin
    memo2.text:=memo2.text + floattostr(Bst);
    end;
  end;
end;
Ich hoffe ihr könnt mir weiterhelfen. Deshalb schonmal danke im voraus

Euer St0rmhunter
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 2. Nov 2011, 14:49
Bist Du einmal durchgesteppt und hast Dir die aktuellen Variableninhalte einmal angesehen? Mal abgesehen davon, dass Du munter hinter dem Stringende weiterliest und Logik und Darstellung vermischst, solltest Du vielleicht ein paar Zwischenvariablen und eine minimale Fehlerbehandlung einbauen, das erleichtert die Fehlersuche enorm.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
St0rmhunter

Registriert seit: 20. Aug 2011
24 Beiträge
 
#3

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 2. Nov 2011, 22:58
Wie ich les hinterm Stringende weiter??
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 2. Nov 2011, 23:01
Wie ich les hinterm Stringende weiter??

Delphi-Quellcode:
to length(memo1.text) do
  begin
    Bst:=strtofloat(memo1.text[i]+memo1.text[i+1]+memo1.text[i+2]);
(Length+2 > index des letzten Zeichens) = hinter dem Stringende lesen
Geh mal in deine Projektotionen und schalte die Indexprüfung an.

Und .Text holt jedesmal, bei jedem Aufruf den Text neu aus dem Memo ... das vorher in eine Variable erspart Vieles.

Zitat:
memo1.text[i]+memo1.text[i+1]+memo1.text[i+2]
PS: Kennst du schon Delphi-Referenz durchsuchenCopy?
$2B or not $2B

Geändert von himitsu ( 2. Nov 2011 um 23:05 Uhr)
  Mit Zitat antworten Zitat
St0rmhunter

Registriert seit: 20. Aug 2011
24 Beiträge
 
#5

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 3. Nov 2011, 17:50
Upps da hab ich wohl die -2 vergessen for i:=1 to length(memo1.text)-2 do .

Nee kenne copy nicht.

So habe die -2 ergänzt und trotzdem kommt noch die Fehlermeldung "Invalid floating point operation"
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 3. Nov 2011, 17:58
Dann zitiere ich mich mal selbst:
Bist Du einmal durchgesteppt und hast Dir die aktuellen Variableninhalte einmal angesehen?
..., solltest Du vielleicht ein paar Zwischenvariablen und eine minimale Fehlerbehandlung einbauen, das erleichtert die Fehlersuche enorm.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 3. Nov 2011, 18:05
es gibt 3 Stellen wo der beschriebene Fehler auftreten kann

Bst:=Bst*b; // Überlauf gegf. Double statt Extended

/ strtoint(edit2.text) // Division durch 0

Trunc( // wenn die Zahl zu groß ist
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
St0rmhunter

Registriert seit: 20. Aug 2011
24 Beiträge
 
#8

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 4. Nov 2011, 16:16
@DeddyH

Zitat:
Bist Du einmal durchgesteppt und hast Dir die aktuellen Variableninhalte einmal angesehen?
Mit durchsteppen hast du bestimmt das mit F7 gemeint, also den nächsten Befehl immer erst nach F7 ausführen oder? Wenn ja ... das klappt bei mir irgendwie nicht

Zitat:
solltest Du vielleicht ein paar Zwischenvariablen und eine minimale Fehlerbehandlung einbauen, das erleichtert die Fehlersuche enorm.
Dann wo denkst du denn sind Zwischenvariablen angebracht? Wüsste nicht wo es hilfreich wäre oder nützlich wäre.
Und zu der Idee mit der minimalen Fehlerbehandlung, sry aber ich weiß nicht was du damit meinst?


@Bummi

Zitat:
Bst:=Bst*b; // Überlauf gegf. Double statt Extended
Double ist kleiner als Extended

Double: 2.23 x 10^-308 bis 1.79 x 10^308 (http://www.delphibasics.co.uk/RTL.asp?Name=Double)
Extended: 3.37 x 10^-4932 to 1.18 x 10^4932 (http://www.delphibasics.co.uk/RTL.asp?Name=Extended)

Zitat:
strtoint(edit2.text) // Division durch 0
Auch ist die Division durch 0 nicht "möglich" weil in edit2 nur positive Zahlen geschrieben werden sollen. Klar wenn der Nutzer 0 reinschreibt isses ne Division durch 0, aber normalerweise stehen da nur positive Zahlen im Feld.

Zitat:
Trunc( // wenn die Zahl zu groß ist
Wie groß darf denn die Zahl bei Trunc( maximal sein?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#9

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 4. Nov 2011, 16:32
Welcher Code ist wohl lesbarer und besser zu debuggen?
Beispiel 1:
Delphi-Quellcode:
//Keine Trennung von Logik und Darstellung
Edit3.Text := IntToStr(StrToInt(Edit1.Text) div StrToInt(Edit2.Text));
Beispiel 2:
Delphi-Quellcode:
var
  Dividend, Divisor, Ergebnis: integer;
begin
  if not TryStrToInt(Edit1.Text, Dividend) then
    begin
      ShowMessage('Edit1 enthält keine gültige Zahl');
      exit;
    end;
  if not TryStrToInt(Edit2.Text, Divisor) then
    begin
      ShowMessage('Edit2 enthält keine gültige Zahl');
      exit;
    end;
  if Divisor = 0 then
    begin
      ShowMessage('Divisor darf nicht 0 sein');
      exit;
    end;
  Ergebnis := Dividend div Divisor;
  Edit3.Text := IntToStr(Ergebnis);
Und wenn der Debugger nicht will (Projektoptionen auf Release gestellt?), dann kann man sich zur Not immer noch mit Zwischenausgaben (ShowMessage z.B.) behelfen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#10

AW: "invalid floating point operation" finde den Fehler nicht

  Alt 4. Nov 2011, 16:42
@DeddyH

Zitat:
Bist Du einmal durchgesteppt und hast Dir die aktuellen Variableninhalte einmal angesehen?
Mit durchsteppen hast du bestimmt das mit F7 gemeint, also den nächsten Befehl immer erst nach F7 ausführen oder? Wenn ja ... das klappt bei mir irgendwie nicht
irgendwie?
was klappt denn da nicht? gibt es eine Fehlermeldung?
vllt hilft es unter den Projektoptionen / Compiler dem Debugger auf die Sprünge zu helfen?

Dann wo denkst du denn sind Zwischenvariablen angebracht? Wüsste nicht wo es hilfreich wäre oder nützlich wäre.
Und zu der Idee mit der minimalen Fehlerbehandlung, sry aber ich weiß nicht was du damit meinst?
Hier z.B.
for j:=2 to strtoint(edit3.text) do
Delphi-Quellcode:
maxj:=strtoint(edit3.text);
if maxj<2 then showmessage('vertan');
for j:=2 to maxj do



Zitat:
strtoint(edit2.text) // Division durch 0
Auch ist die Division durch 0 nicht "möglich" weil in edit2 nur positive Zahlen geschrieben werden sollen. Klar wenn der Nutzer 0 reinschreibt isses ne Division durch 0, aber normalerweise stehen da nur positive Zahlen im Feld.
[/QUOTE]

"normalerweise" ist nicht das gleiche wie NIE!

Normalerweise scheint im Sommer die Sonne und es ist warm (die Frage ist nur wo, und warm ist ziemlich relativ )

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:25 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