AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Von C++ nach Delphi (Union + Struct)

Ein Thema von Alter Mann · begonnen am 18. Mai 2011 · letzter Beitrag vom 19. Mai 2011
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
936 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Von C++ nach Delphi (Union + Struct)

  Alt 18. Mai 2011, 13:58
Hallo habe hier eine typedef mit deren Umsetzung ich ein paar Probleme habe:

Code:
typedef union _BM_REQUEST_TYPE {
  struct _BM (
   UCHAR Recpient:2;
   UCHAR Reserved:3;
   UCHAR Type:2;
   UCHAR Dir:1;
  );
  UCHAR B;
} BM_REQUEST_TYPE, *PBM_REQUEST_TYPE;
Ich würde es ja so versuchen:
Delphi-Quellcode:
 BMrec = record
   Recpient: UCHAR;
   Reserved: UCHAR;
   Type : UCHAR;
   Dir : UCHAR;
 end;

 _BM_REQUEST_TYPE record
 case Integer of
  0 : (_BM : BMrec);
  1 : ( B : UCHAR);
 end;
Doch was haben die Zahlen im der _BM struct zu bedeuten und ist die union so richtig?
Auch mit Google habe ich noch nichts verwertbares gefunden.

Wie immer: vielen Dank für die Mühe.
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 18. Mai 2011, 14:03
Also ich fürchte, die Zahlen stehen für die Bitbelegung, und demnach kannst du das nicht so einfach übersetzen.
2+3+2+1=8, also nimmt das Struct insgesamt 1 Byte ein, während das Record 4 Bytes verbraucht.

Recpient belegt die ersten zwei Bits, kann also Werte von 0 bis 3 enthalten.
Reserved belegt weitere drei Bits und kann Werte von 0 bis 7 enthalten.
Type belegt weitere zwei Bits und kann Werte von 0 bis 3 enthalten.
Dir ist nur ein Bit und kann damit nur 0 oder 1 sein.

Um damit in Delphi umzugehen, musst du wohl oder übel mit And, Shl + Shr arbeiten.

Geändert von implementation (18. Mai 2011 um 14:06 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 18. Mai 2011, 14:09
.. wäre da BMRec ein Anwendungsfall für Record-Funktionen?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
936 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

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

  Alt 18. Mai 2011, 14:25
Okay, ich habe in der Header-Datei etwas weiter gescrollt und dann kamm die
Erklärung für die Zahlen :

Code:
  struct _BM (
   UCHAR Recpient:2;
   UCHAR Reserved:3;
   UCHAR Type:2;
   UCHAR Dir:1;
  );
würde demnach in Delphi so aussehen:
Delphi-Quellcode:
 _BM = record
   Recpient: ARRAY[0..2] of UCHAR;
   Reserved: ARRAY[0..3] of UCHAR;
   Type : ARRAY[0..2] of UCHAR;
   Dir : ARRAY[0..1] of UCHAR;
 end;
Aber wie sieht es mit dem union aus?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 18. Mai 2011, 14:41
würde demnach in Delphi so aussehen:
Delphi-Quellcode:
 _BM = record
   Recpient: ARRAY[0..2] of UCHAR;
   Reserved: ARRAY[0..3] of UCHAR;
   Type : ARRAY[0..2] of UCHAR;
   Dir : ARRAY[0..1] of UCHAR;
 end;
Falsch. Die Zahlen stehen für Bits, nicht Arrays.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 18. Mai 2011, 19:31
Guten Abend,

ich hatte mir das ungefähr so vorgestellt:
Delphi-Quellcode:
interface
type
  BMRec = packed record
    data : Byte;
    function Recipient : Byte;
    function Reserved : Byte;
    function _Type : Byte;
    function Dir : Byte;
  end;

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

implementation

 function BMRec.Recipient:Byte;
 begin
   result := (data and $C0) shr 6;
 end;

 function BMRec.Reserved: Byte;
 begin
   result := (data and $37) shr 3;
 end;

 function BMRec._Type: Byte;
 begin
   result := (data and $06) shr 1;
 end;

 function BMRec.Dir : Byte;
 begin
   result := (data and $01);
 end;
Benutzen kann man es so:
Delphi-Quellcode:

procedure TForm1.Button1Click(Sender: TObject);
var
  BM_REQUEST_TYPE : _BM_REQUEST_TYPE;
begin
  edit1.Text := IntToStr(sizeOf(BMRec));
  edit2.Text := intToStr(sizeOf(_BM_REQUEST_TYPE));

  BM_REQUEST_TYPE.B := $80;
  edit3.Text := intToStr(BM_REQUEST_TYPE._BM.Recipient);
end;
Grüße
Klaus
Klaus

Geändert von Klaus01 (18. Mai 2011 um 20:55 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 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