![]() |
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:
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?
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; 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 |
AW: Prüfen ob eine Single Variable einen gültigen Wert enthält
Du könntest vor der Rückgabe
Delphi-Quellcode:
abfragen und je nach Ergebnis den Result entsprechend ändern.
Result.SpecialType
|
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:
Funktioniert perfekt. Mit NaN kann ich was anfangen bzw. das wird auch überall sauber als "NaN" angezeigt...
if Result.SpecialType in [fsDenormal, fsNDenormal, fsInf, fsNInf] then
Result := Single.NaN; Nachtrag! Korrekt muss es sein:
Delphi-Quellcode:
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...
if Result.SpecialType in [fsDenormal, fsNDenormal, fsInf, fsNInf, fsNan] then
Result := Single.NaN; Alex |
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:
vs.
if einBoolen then
Delphi-Quellcode:
... sowas macht man einfach nicht.
if einBoolean = True then
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 02:23 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