![]() |
AW: 32 Bit Wert verschieden interpretieren
Ich habs nun mal so gemacht. Muss nur noch testen. Das Array ar4 enthält dann die 4 Bytes, unabhängig, ob es Single, LongWord oder LongInt ist.
Delphi-Quellcode:
Function WriteToSvr(Address: Longword; dValue: Longword): Boolean; overload;
var Adr1 : Longword; Wert : Longword; ar: ar4 absolute Wert; begin Result := False; Adr1 := Address; Wert := dValue; If WriteToSvr3(Adr1, ar) then begin Result := True; end; end; Function WriteToSvr(Address: Longword; dValue: LongInt): Boolean; overload; var Adr1 : Longword; Wert : LongInt; ar: ar4 absolute Wert; begin Result := False; Adr1 := Address; Wert := dValue; If WriteToSvr3(Adr1, ar) then begin Result := True; end; end; Function WriteToSvr(Address: Longword; dValue: Single): Boolean; overload; var Adr1 : Longword; Wert : Single; ar: ar4 absolute Wert; begin Result := False; Adr1 := Address; Wert := dValue; If WriteToSvr3(Adr1, ar) then begin Result := True; end; end; |
AW: 32 Bit Wert verschieden interpretieren
Mit einem varianten Record sollte das aber auch funktionieren, und zwar kürzer.
Delphi-Quellcode:
type
TConvRec = record case integer of 0: (d: double); 1: (i: LongInt); 2: (w: LongWord); 3: (LoLo, HiLo, LoHi, HiHi: Byte); end; procedure TForm1.Button1Click(Sender: TObject); var Rec: TConvRec; begin Rec.i := -2147483647; ShowMessage(Format('%d, %d, %d, %d', [Rec.HiHi, Rec.LoHi, Rec.HiLo, Rec.LoLo])); Rec.w := 4294967295; ShowMessage(Format('%d, %d, %d, %d', [Rec.HiHi, Rec.LoHi, Rec.HiLo, Rec.LoLo])); Rec.d := 1.7e308; ShowMessage(Format('%d, %d, %d, %d', [Rec.HiHi, Rec.LoHi, Rec.HiLo, Rec.LoLo])); end; |
AW: 32 Bit Wert verschieden interpretieren
Für mich hört sich das sehr danach an als ob du z.B. einen varianten Record suchst... ungetestetes Beispiel, das sollte mit Delphi 2009 schon gehen:
Delphi-Quellcode:
Ich sehe schon die rote Box, aber ich poste wegen dem Operator mal trotzdem...
type
TMy4ByteData = packed record type TDataType = (dtSingle, dtInteger, dtLongWord); class operator implicit(const Value: TMy4ByteData): TArray<Byte>; case DataType: TDataType of dtSingle: (ValueAsSingle: Single); dtInteger: (ValueAsInteger: Integer); dtLongWord: (ValueAsLongWord: LongWord); end; // ... class operator TMy4ByteData.implicit(const Value: TMy4ByteData): TArray<Byte>; begin SetLength(Result, 4); CopyMemory(Pointer(Result), @Value.ValueAsInteger, 4); end; procedure Example(const AValue: TMy4ByteData); begin case AValue.DataType of dtSingle: ShowMessage('Single: ' + FloatToStr(AValue.ValueAsSingle)); dtInteger: ShowMessage('Integer: ' + IntToStr(AValue.ValueAsInteger)); dtLongWord: ShowMessage('LongWord: ' + IntToStr(AValue.ValueAsLongWord)); end; end; var Value: TMy4ByteData; ValueData: TArray<Byte>; CurrentByte: Byte; begin Value.DataType := dtSingle; Value.ValueAsSingle := 4.5; Example(Value); ValueData := Value; for CurrentByte in ValueData do ShowMessage(IntToStr(CurrentByte)); end; |
AW: 32 Bit Wert verschieden interpretieren
Wieso das
Delphi-Quellcode:
nicht so?
If WriteToSvr3(Adr1, ar) then begin
Result := True; end;
Delphi-Quellcode:
Result := WriteToSvr3(Adr1, ar);
|
AW: 32 Bit Wert verschieden interpretieren
Zitat:
Ich hatte in dem Zweig ursprünglich noch etwas anderes drin. Aber jetzt nicht mehr. So könnte ich den Code noch ein wenig schlanker machen. |
AW: 32 Bit Wert verschieden interpretieren
Dann kannst du auch
Delphi-Quellcode:
entfernen.
Result := False;
|
AW: 32 Bit Wert verschieden interpretieren
Zitat:
Das mit den varianten Records muss ich mir mal später genauer anschauen. Vielleicht kann das später in mein Projekt mit reinwachsen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 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-2025 by Thomas Breitkreuz