Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi 32 Bit Wert verschieden interpretieren (https://www.delphipraxis.net/168368-32-bit-wert-verschieden-interpretieren.html)

zeras 17. Mai 2012 17:20

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;

DeddyH 17. Mai 2012 17:33

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;

jaenicke 17. Mai 2012 17:34

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:
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;
Ich sehe schon die rote Box, aber ich poste wegen dem Operator mal trotzdem...

Popov 17. Mai 2012 18:03

AW: 32 Bit Wert verschieden interpretieren
 
Wieso das
Delphi-Quellcode:
  If WriteToSvr3(Adr1, ar) then begin
    Result := True;
  end;
nicht so?

Delphi-Quellcode:
  Result := WriteToSvr3(Adr1, ar);

zeras 17. Mai 2012 18:12

AW: 32 Bit Wert verschieden interpretieren
 
Zitat:

Zitat von Popov (Beitrag 1166986)
Wieso das
Delphi-Quellcode:
  If WriteToSvr3(Adr1, ar) then begin
    Result := True;
  end;
nicht so?

Delphi-Quellcode:
  Result := WriteToSvr3(Adr1, ar);

Gute Idee.
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.

Popov 17. Mai 2012 18:14

AW: 32 Bit Wert verschieden interpretieren
 
Dann kannst du auch
Delphi-Quellcode:
Result := False;
entfernen.

zeras 17. Mai 2012 18:18

AW: 32 Bit Wert verschieden interpretieren
 
Zitat:

Zitat von DeddyH (Beitrag 1166981)
Mit einem varianten Record sollte das aber auch funktionieren, und zwar kürzer.

Danke für die Info.
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 21:21 Uhr.
Seite 2 von 2     12   

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