Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Problem "ungültige Gleitkomma-Opertion" (https://www.delphipraxis.net/160278-problem-ungueltige-gleitkomma-opertion.html)

yogie 5. Mai 2011 15:18

Problem "ungültige Gleitkomma-Opertion"
 
Hallo zusammen,

meine Frage bezieht sich auf einen Fehler „Ungülige Gleitkomma-Operation“; (d.i. Nummer 207 laut Delphi-Hilfe).

Dieser Fehler tritt sporadisch in einem online Meßprogramm auf, zeigt eine (nicht von mir erzeugte) Message und hält das Programm an.

Das Programm empfängt über eine seriellle Schnittstelle einen String mit Daten (Semikolon als Trenner, CR LF als Ende-Zeichen). Der String wird zerlegt und die Teile dann in Float-Variablen gewandelt. Diese Wandlung ist in try excepts eingebettet.

Frage 1 : Gibt es eine Möglichkeit die Anzeige der Message und damit den Programmhalt zu unterbinden? Dann sind zwar die Daten verloren, es geht aber wenigsten weiter.

Frage 2 : Mir gelingt es nicht, durch eine erzwungene Manipulation der hereinkommenden Daten diese Fehlermeldung zu erzwingen. Welcher Umstand erzeugt diese Meldung?

s.h.a.r.k 5. Mai 2011 15:27

AW: Problem "ungültige Gleitkomma-Opertion"
 
Wenn du das Parsen des Strings innerhalb von einem try-except-Block erledigst und auch passend auf den Fehler reagierst, dann sollte das nicht das Problem sein und zum Programmende führen. Der Fehler liegt somit außerhalb dieses try-except-Blocks. Und ab hier kann dir nun keiner mehr helfen, da wir keinen Code sehen.

Was machst du sonst noch mit den Daten? (also außerhalb des try-excepts)

Bummi 5. Mai 2011 15:31

AW: Problem "ungültige Gleitkomma-Opertion"
 
erster Verdächtiger Division durch 0 ?

Aphton 5. Mai 2011 16:24

AW: Problem "ungültige Gleitkomma-Opertion"
 
http://www.youtube.com/watch?v=_N37AEYPCj4

s.h.a.r.k 5. Mai 2011 16:46

AW: Problem "ungültige Gleitkomma-Opertion"
 
Zitat:

Zitat von Aphton (Beitrag 1099120)

Wahrscheinlich nicht all zu einfach den Effekt zu coden, aber richtig witzig war es imho nun nicht :stupid:

yogie 5. Mai 2011 17:41

AW: Problem "ungültige Gleitkomma-Opertion"
 
also erstmal danke für die Antworten.

Die Angelegenheit ist durchaus komplex, verschiedene Typen
von sendenden Geräten, unterschiedliche Anzahl von Daten usw...

Ich vermute ja auch, daß es nicht mit der Wandlung string zu single
zu tun hat.

Mir geht es darum in einem Test erstmal diesen speziellen Fehler in
einem eigenständigen Programm zu erzeugen und dann zu schauen was man
machen kann. Bisher habe ich es nicht geschafft den betreffenden Fehler zu erzeugen.

Weiter suche ich sowas wie einen Compiler-Schalter mit dem man
die Ausgabe der message unterdrücken kann. So in der Art wie man
ja auch die Bereichprüfung abschalten kann.

Luckie 5. Mai 2011 17:46

AW: Problem "ungültige Gleitkomma-Opertion"
 
Wie sieht denn deine Fehlerbehandlung aus? Mit einer richtigen try-except Verwendung sollte man das in den Griff bekommen können.

s.h.a.r.k 5. Mai 2011 17:58

AW: Problem "ungültige Gleitkomma-Opertion"
 
Zitat:

Zitat von yogie (Beitrag 1099149)
Weiter suche ich sowas wie einen Compiler-Schalter mit dem man
die Ausgabe der message unterdrücken kann. So in der Art wie man
ja auch die Bereichprüfung abschalten kann.

Äh? Wozu denn das? Sowas wie "ich will keine Fehler" sehen wäre eher ungeschickt, da es ja ein Problem innerhalb des Programms ist, welches ja behoben werden sollte. Ein "was ich nicht sehe, ist nicht da" wäre hier sehr sehr ungeschickt.

Daher musst du nach der Stelle suchen, an der der Fehler auftritt. Und diese liegt, wie oben schon erwähnt außerhalb deiner bisherigen try-except-Blöcke -- außer du machst ein
Delphi-Quellcode:
raise;
innerhalb des except-Parts.

Sir Rufo 5. Mai 2011 18:45

AW: Problem "ungültige Gleitkomma-Opertion"
 
Wozu erfolgt denn die Umwandlung in einem try..except Block?
Delphi-Referenz durchsuchenTryStrToFloat wäre die bessere Alternative, da die Exception-Behandlung durchaus sparsam eingesetzt werden sollte (schon aufgrund der Performance-Verluste).

Delphi-Quellcode:
ValOk := True;
ValOk := ValOk and TryStrToFloat( S1, V1 );
ValOk := ValOk and TryStrToFloat( S2, V1 );
...
ValOk := ValOk and TryStrToFloat( S9, V9 );

If ValOk then
  try
    // Berechnungen mit den Zahlen durchführen
  except
    ShowMessage( 'Fehler Berechnung: Auch das hier gehört in ein Log!' );
  end
else
  ShowMessage( 'Fehler Import: Man könnte jetzt auch ein Log schreiben!' );

Hawkeye219 5. Mai 2011 19:04

AW: Problem "ungültige Gleitkomma-Opertion"
 
Hallo,

der Fehler tritt auch auf, wenn Gleitkommawerte mittels Trunc oder Round in ganzzahlige Werte (z.B. für die Anzeige in einem Chart) umgewandelt werden und dabei der Integer-Bereich verlassen wird.

Gruß Hawkeye

FredlFesl 6. Mai 2011 06:54

AW: Problem "ungültige Gleitkomma-Opertion"
 
Empfängst Du einen IEE-754 konformen Bytestream, der dann in Float gecastet wird?
Oder einen String, der mit StringToFloat umgewandelt wird?

Du schreibst zwar 'Umwandlung string zu float', aber sicherheitshalber frage ich nochmal nach.

Was passiert, wenn Du eine Zahl > MaxSingle (ca. 1E+127) in Single konvertieren willst?

Geht Double nicht? Also, zuerst in Double konvertieren und dann prüfen?

yogie 6. Mai 2011 07:08

AW: Problem "ungültige Gleitkomma-Opertion"
 
@ Sir Rufo : danke für den Tip, werde ich so einbauen

Zur Unterdrückung der Fehlermeldungen :
Ich will einfach, daß das Programm weiterläuft,
auch wenn der Fehler aufgetreten ist. Ich darf bei den Daten
(Laufzeit einer Messung ca. 8 Std.) zwar einen Satz auslassen, bloß
hänenbleiben darf die Messung / Aufzeichnung nicht

Zuum Datenformat :
es kommt ein string mit Single in der Art wie
0.1234E3;2.5478E_5;9.8765E4 usw.
der wird zerlegt (Explode_Implode) und dann die einzelnen Teile
mit StrToFloat gewandelt

Nochmal die Frage : was erzeugt eigentlich diesen Fehler,
so etwas wie x/0 ist es jedenfalls nicht. Ich kann in einem
Testprogramm keien Situation herstellen, die diese Fehlermedung
provoziert.

Sir Rufo 6. Mai 2011 07:28

AW: Problem "ungültige Gleitkomma-Opertion"
 
Zitat:

Zitat von yogie (Beitrag 1099214)
@ Sir Rufo : danke für den Tip, werde ich so einbauen

Nochmal die Frage : was erzeugt eigentlich diesen Fehler,
so etwas wie x/0 ist es jedenfalls nicht. Ich kann in einem
Testprogramm keien Situation herstellen, die diese Fehlermedung
provoziert.

Das können wir dir auch nicht sagen :glaskugel:

Aber bau das zunächst mal um mit dem Loggen und lasse dir in das Log auch die Zeile ausgeben, die den Fehler verursacht hat.
Diese Daten kann man sich dann genauer ansehen und analysieren.

Bislang ist das ja rumstochern im Nebel :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 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