Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 2 Word zu einer Single (https://www.delphipraxis.net/151084-2-word-zu-einer-single.html)

TeronG 5. Mai 2010 13:40


2 Word zu einer Single
 
Hallo

Ich habe das Problem über einen Modbus einen Real auszulesen.
Da der Modbus keine Real mag habe ich einfach die Gleitkommazahl (32bit) in 2 Words (a 16bit) Zerlegt und übertrage einfach diese.

Nun ist mein Problem, das ich die in Delphi nicht wieder zusammen und dann in eine real/float/Single bekomme. :(

Einfach mal das 2te Word nach links schieben (shl 16) und dann das Erste dazuaddieren und zu einer Single machen klappt ja schon aber dann habe ich nur eine sehr große Ganzzahl und nicht meine real ... *gruebel*

Das selbe Problem musste ich schon mal in C# lösen ... da gabs so nen schönen BitConverter hat Delphi sowas auch!?

Habt ihr da ne idee wie das klappen könnte?

chaosben 5. Mai 2010 13:44

Re: 2 Word zu einer Single
 
Ich würde das per absolute lösen

Delphi-Quellcode:
procedure Bla;
var
  MyInt : Integer;
  MySingle : Single absolute MyInt;
begin
  MyInt := (Word1 shl 16) + Word2;
  //et voila ... MySingle hat den gewünschten Wert
end;
Hintergrund: Durch die absolute-Direktive stehen beide Variablen im Speicher an der gleichen Stelle.

TeronG 5. Mai 2010 14:00

Re: 2 Word zu einer Single
 
Thanks
Cool ... :thumb:
Und ich habe schon befürchtet ich müsse (manuel) Pointer verbiegen oder gar das Single bitweise setzen. :stupid:

guinnes 5. Mai 2010 14:15

Re: 2 Word zu einer Single
 
Oder als VariantenRecord :

Delphi-Quellcode:
Type
  TWordSingle = Record
    case Integer of
      1  : (Words : Array[0..1] of Word);
      2  : (SingleValue : Single);
  end;
....

WordSingle.Words[0] := Word1;
WordSingle.Words[1] := Word2;
Result := WordSingle.SingleValue;

TeronG 5. Mai 2010 14:25

Re: 2 Word zu einer Single
 
Klappt beides recht fein. :)

Interesanterweise wird 12,34 in 12,3400001525879 umgewandelt.
Was mich (beim REAL) nicht wirklich verwundert stört.
Mit dem BitConverter habe ich allerdings ein 12,34 zurückbekommen ... ob da wohl einer rundet. -.-"

himitsu 5. Mai 2010 15:00

Re: 2 Word zu einer Single
 
Single und eigentlich alle Fließkommatypen runden nunmal alle, bedingt durch ihre interne Darstellung.

Und so schwer ist das mit den Pointern nun auch nicht.
Delphi-Quellcode:
var L: LongWord;
  S: Single;

S := PSingle(@L)^;

TeronG 6. Mai 2010 07:43

Re: 2 Word zu einer Single
 
Naja .. schwer mag das nicht sein aber ..
a) mag ich Pointer eigentlich nicht und
b) habe ich wegen a keine übung/erfahrung mit pointern. :stupid:


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