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
Seite 1 von 2  1 2      
Klaus01

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

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
948 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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
 
#3

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.779 Beiträge
 
Delphi 10.4 Sydney
 
#4

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
Alter Mann

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

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

  Alt 19. Mai 2011, 06:41
@implementation

Könnte ich das etwas näher erklärt bekommen?

@Klaus01

Schön wäre es gewesen, aber in einem Record bekomme ich keine funktionen unter (D7).

Danke aber trotzdem

OH, ich hätte wohl die vorhergehenden Beiträge mal lesen sollen(peinlich)

Also gut, dann werde ich mich wohl durchquälen müssen.

Danke noch mal.

Geändert von Alter Mann (19. Mai 2011 um 06:52 Uhr)
  Mit Zitat antworten Zitat
Robotiker
(Gast)

n/a Beiträge
 
#6

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

  Alt 19. Mai 2011, 07:55
Hallo,

hier ist die Doku zu Bitfeldern beim C++ Builder und Visual C++
http://docwiki.embarcadero.com/RADStudio/en/Bit_Fields
http://msdn.microsoft.com/de-de/library/ewwyfdbe.aspx

Man sollte auch schauen, von welchem C++ Compiler der umzusetzende Code kommt, denn in der C++ Builder Doku steht:

Zitat:
According to the C and C++ language specifications, the alignment and storage of bit fields is implementation defined. Therefore, compilers can align and store bit fields differently. If you want complete control over the layout of bit fields, it is advisable to write your own bit field accessing routines and create your own bit fields.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 19. Mai 2011, 08:06
Hier mal mein Vorschlag für D7:

Delphi-Quellcode:
type
  TBMRecContent = (bmRecipient, bmReserved, bmType, bmDir);
  TBMRec = record
    data : Byte;
  end;

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

:

implementation

:

function getBMRecContent(BMRecContent:TBMRecContent; BMRec:TBMRec): Byte;
begin
  case BMRecContent of
    bmRecipient: result := (BMRec.data shr 6) and 3;
    bmReserved: result := (BMRec.data shr 3) and 7;
    bmType: result := (BMRec.data shr 1) and 3;
    bmDir: result := (BMRec.data and 1);
  else
    Result:=0;
  end;
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(bmRecipient, BM_REQUEST_TYPE._BM),
     getBMRecContent(bmReserved, BM_REQUEST_TYPE._BM),
     getBMRecContent(bmType, BM_REQUEST_TYPE._BM),
     getBMRecContent(bmDir, BM_REQUEST_TYPE._BM)]
  ));
end;

Geändert von omata (19. Mai 2011 um 08:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#8

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

  Alt 19. Mai 2011, 08:11
@Klaus01:
Sehr schön. Aber ein Union ist da nicht nötig, da man ja bereits auf BMRec.data zugreifen kann.

@Alter Mann:
Und warum nutzt du nicht D2009? ^^


PS:
ihmo ist erst schieben und dann Und-Verknüpfen besser zu lesen, da nicht so Werte wie $37 vorkommen.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

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

  Alt 19. Mai 2011, 08:12
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;

Geändert von omata (19. Mai 2011 um 08:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#10

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

  Alt 19. Mai 2011, 08:21
Da fällt mir auf, dass $37 falsch ist, es müsste $38 sein. Ich sag ja: Erst schieben Dann wäre es $07 und der falsche Wert wäre wohl nicht zustande gekommen bzw. schneller aufgefallen.
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:39 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