![]() |
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; |
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.
|
AW: Von C++ nach Delphi (Union + Struct)
Zitat:
|
AW: Von C++ nach Delphi (Union + Struct)
Zitat:
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: |
AW: Von C++ nach Delphi (Union + Struct)
Hab es wieder korrigiert
|
AW: Von C++ nach Delphi (Union + Struct)
Zitat:
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; |
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? |
AW: Von C++ nach Delphi (Union + Struct)
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 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