Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Prüfen ob eine Single Variable einen gültigen Wert enthält (https://www.delphipraxis.net/211207-pruefen-ob-eine-single-variable-einen-gueltigen-wert-enthaelt.html)

BigAl 13. Aug 2022 16:01

Prüfen ob eine Single Variable einen gültigen Wert enthält
 
Hallo zusammen,

folgendes Problem: Ich erhalte über eine Kommunikation einen Byte-Stream. In diesem Stream sind die verschiedensten Variablentypen enthalten (Words, Single usw.). Das ganze wird dann über Offset-Adressen konvertiert. z.B.:

Delphi-Quellcode:
function GetReal(P: Pointer): Single;
Var
  V: array [0 .. 3] of Byte absolute Result;
begin
  V[0] := PByte(NativeInt(P) + 3)^;
  V[1] := PByte(NativeInt(P) + 2)^;
  V[2] := PByte(NativeInt(P) + 1)^;
  V[3] := PByte(P)^;
end;
Nun kann es aber vorkommen, dass Pointer in einen falschen Bereich zeigt oder im Stream nicht steht was erwartet wurde. Das ist ein reguläres Verhalten welches zur Analyse verwendet wird. Wie kann ich (ohne Exception) feststellen, ob "Result" einen gültigen Wert beinhaltet?

Ich würde gerne bei ungültigem Inhalt die Variable zu NaN oder zu 0.0 machen. Leider weiß ich nicht wie ich möglichst einfach rausbekomme ober der Inhalt gültig ist.

Alex

Uwe Raabe 13. Aug 2022 16:31

AW: Prüfen ob eine Single Variable einen gültigen Wert enthält
 
Du könntest vor der Rückgabe
Delphi-Quellcode:
Result.SpecialType
abfragen und je nach Ergebnis den Result entsprechend ändern.

BigAl 13. Aug 2022 16:42

AW: Prüfen ob eine Single Variable einen gültigen Wert enthält
 
Hallo Uwe!

As always: Du bist einfach klasse. Manchmal is es so einfach :-)

Ich hab es so gemacht:
Delphi-Quellcode:
  if Result.SpecialType in [fsDenormal, fsNDenormal, fsInf, fsNInf] then
    Result := Single.NaN;
Funktioniert perfekt. Mit NaN kann ich was anfangen bzw. das wird auch überall sauber als "NaN" angezeigt...

Nachtrag! Korrekt muss es sein:
Delphi-Quellcode:
  if Result.SpecialType in [fsDenormal, fsNDenormal, fsInf, fsNInf, fsNan] then
    Result := Single.NaN;
NaN ist scheinbar nicht gleich NaN. Result.ToString wirft ein Exception, wenn z.B. die Byte-Folge 255, 140, 66, 150 in den den Speicherbereich des Singles geladen wird. SpecialType ergibt dann zwar fsNan, aber alle weiteren Funktionen, welche diesen Single benutzen, werfen eine Exception. Wird explizit NaN in den Single geschrieben, dann gibt ToString ein 'NAN' aus...

Alex

himitsu 14. Aug 2022 01:33

AW: Prüfen ob eine Single Variable einen gültigen Wert enthält
 
fsNZero ist doch im Prinzip auch irgendwie ungültig?

Bei so viel ungültig, würde ich es auch eher andersrum sehen.
Delphi-Quellcode:
if not (Result.SpecialType in [fsZero, fsPositive, fsNegative]) then
  Result := Single.NaN;

Schonmal auf die Idee gekommen in den Code zu sehen?

ToString geht im Prinzip davon aus, dass der Wert immer "gültig" ist, wobei der "NAN" auch ein gültiger "Wert" ist.

Die Zahl wird versucht zu decodieren und bei einem ganz bestimmten Werten (Exponent) wird dann INF, -INF oder NAN ausgegeben.
Aber lässt es sich nicht dekodieren, dann knallt es nunmal, weil ToString/FloatToStr/uvm. nur den Wert NAN kennt/bachtet, aber nicht den Zustand NaN.


Ist wie bei
Delphi-Quellcode:
if einBoolen then
vs.
Delphi-Quellcode:
if einBoolean = True then
... sowas macht man einfach nicht.


siehe
TSingleHelper.SpecialType
und
TSingleHelper.ToString > FloatToStr > FloatToText > InternalFloatToText -> FloatToDecimal und erst danach das "if is NaN"


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