Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Von C++ nach Delphi (Union + Struct) (https://www.delphipraxis.net/160536-von-c-nach-delphi-union-struct.html)

omata 19. Mai 2011 08:12

AW: Von C++ nach Delphi (Union + Struct)
 
Zweiter Vorschlag:

Delphi-Quellcode:
type
  TBMRecContent = record
    Recipient: Byte;
    Reserved: Byte;
    _Type: Byte;
    Dir: Byte;
  end;

  TBMRec = record
    data : Byte;
  end;

  _BM_REQUEST_TYPE = packed record
    case Byte of
      0 : (_BM: TBMRec);
      1 : (B: Byte);
  end;

:

implementation

:

function getBMRecContent(BM_REQUEST_TYPE:_BM_REQUEST_TYPE): TBMRecContent;
begin
  Result.Recipient:= (BM_REQUEST_TYPE._BM.data shr 6) and 3;
  Result.Reserved:= (BM_REQUEST_TYPE._BM.data shr 3) and 7;
  Result._Type:= (BM_REQUEST_TYPE._BM.data shr 1) and 3;
  Result.Dir:= (BM_REQUEST_TYPE._BM.data and 1);
end;

procedure TForm.ButtonClick(Sender: TObject);
var BM_REQUEST_TYPE: _BM_REQUEST_TYPE;
begin
  BM_REQUEST_TYPE._BM.data:=3;
  ShowMessage(Format(
    'Recipient = %d, Reserved = %d, Type = %d, Dir = %d',
    [getBMRecContent(BM_REQUEST_TYPE).Recipient,
     getBMRecContent(BM_REQUEST_TYPE).Reserved,
     getBMRecContent(BM_REQUEST_TYPE)._Type,
     getBMRecContent(BM_REQUEST_TYPE).Dir]
  ));
end;

Deep-Sea 19. Mai 2011 08:21

AW: Von C++ nach Delphi (Union + Struct)
 
Da fällt mir auf, dass $37 falsch ist, es müsste $38 sein. Ich sag ja: Erst schieben :-D Dann wäre es $07 und der falsche Wert wäre wohl nicht zustande gekommen bzw. schneller aufgefallen.

omata 19. Mai 2011 08:34

AW: Von C++ nach Delphi (Union + Struct)
 
Zitat:

Zitat von Deep-Sea (Beitrag 1101698)
Da fällt mir auf, dass $37 falsch ist, es müsste $38 sein. Ich sag ja: Erst schieben :-D Dann wäre es $07 und der falsche Wert wäre wohl nicht zustande gekommen bzw. schneller aufgefallen.

ups, hab es korrigiert

Deep-Sea 19. Mai 2011 08:41

AW: Von C++ nach Delphi (Union + Struct)
 
Zitat:

Zitat von omata (Beitrag 1101704)
ups, hab es korrigiert

Aber auch net richtig :P
Du musst anstatt mit 2 mit 3 und anstatt mit 3 mit 7 maskieren.
Denn 2 = 0b0010, wir wollen ja aber zwei Bits haben, also 0b0011 = 3 (und für 3 bzw. 7 ebenso) :wink:

omata 19. Mai 2011 08:46

AW: Von C++ nach Delphi (Union + Struct)
 
Hab es wieder korrigiert

Deep-Sea 19. Mai 2011 08:54

AW: Von C++ nach Delphi (Union + Struct)
 
Zitat:

Zitat von omata (Beitrag 1101707)
Hab es wieder korrigiert

Jap, so sollte es stimmen.

Wo ich schon dabei bin, hier mal kurz meine Version:
Delphi-Quellcode:
type
  TRequestType = record
    Recipient: Byte;
    Reserved: Byte;
    Typ: Byte;
    Dir: Boolean;
  end;

implementation

function DecodeRequestType(ARequestType: Byte): TRequestType;
begin
  With Result do
  begin
    Recipient := (ARequestType shr 6) and 3;
    Reserved := (ARequestType shr 3) and 7;
    Typ := (ARequestType shr 1) and 3;
    Dir := (ARequestType and 1) > 0;
  end;
end;

// Ggf. zusätzlich: function EncodeRequestType(ARequestType: TRequestType): Byte;

procedure TForm1.Button1Click(Sender: TObject);
var
  LRequestType: TRequestType;
begin
  LRequestType := DecodeRequestType( { Wert holen } );
  ShowMessageFmt('Recipient = %d, Reserved = %d, Type = %d, Dir = %d',
    [LRequestType.Recipient, LRequestType.Reserved, LRequestType.Typ, Ord(LRequestType .Dir)]);
end;

Alter Mann 19. Mai 2011 10:16

AW: Von C++ nach Delphi (Union + Struct)
 
Danke Leute ihr habt mir sehr geholfen.
Die Doku zu den Bit-Feldern werde ich mir durchlesen (und hoffentlich auch verstehen).

@Deep-Sea: Ich werde deine Version testen. Es dauert nur noch eine Weile denn es sind ein paar
Header-Dateien mehr. Was wäre den in D2009 anders, wenn ich fragen darf?

omata 19. Mai 2011 10:18

AW: Von C++ nach Delphi (Union + Struct)
 
Zitat:

Zitat von Alter Mann (Beitrag 1101730)
Was wäre den in D2009 anders, wenn ich fragen darf?

Funktionen innerhalb eines Records.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.
Seite 2 von 2     12   

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