Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   C++ Diese C++ Struktur in Delphi? (https://www.delphipraxis.net/63342-diese-c-struktur-delphi.html)

Pseudemys Nelsoni 17. Feb 2006 09:18


Diese C++ Struktur in Delphi?
 
Moin,

kann mir jemand diesen Code in DelphiSyntax umsetzen?:

Delphi-Quellcode:
typedef struct   {
   DWORD   isPID;         

   union   {

      struct   {

         DWORD   isSR;   
         BYTE   byMode;      

         } MP;               

         struct
         {

         DWORD         isSV;   
         DWORD         isSS;

         } LHG;               

      struct   {

         DWORD   diSS;
         BYTE   byMode;

      } CA;

   } format;
      
} PE_CONF, *PPE_CONF;

NicoDE 17. Feb 2006 09:33

Re: Diese C++ Struktur in Delphi?
 
Delphi-Quellcode:
type
  PPE_CONF = ^PE_CONF;
  PE_CONF = record
    isPID : DWORD;
    format: record
      case Integer of
        0: (
          MP: record
            isSR : DWORD;
            byMode: BYTE;
          end);
        1: (
          LGH: record
            isSV : DWORD;
            isSS : DWORD;
          end);
        2: (
          CA: record
            diSS : DWORD;
            byMode: BYTE;
          end);
    end;
  end;

Pseudemys Nelsoni 17. Feb 2006 10:08

Re: Diese C++ Struktur in Delphi?
 
Moin Nico,

danke für Deinen Code. Der funktioniert auch soweit. Dennoch habe ich 2 weitere Fragen dazu....

1: Wieso funktioniert folgender Code nicht?:

Delphi-Quellcode:
  PBE_CONFIG = ^BE_CONFIG;
  BE_CONFIG = record
     dwConfig: DWORD;
    format: record
      case Integer of
        0: (mp3: record
                 dwSampleRate: DWORD;
              byMode: BYTE;
               wBitrate: WORD;
               bPrivate: BOOL;
               bCRC: BOOL;
               bCopyright: BOOL;
               bOriginal: BOOL;
          end);
        1: (LHV1: record
                 dwStructVersion: DWORD;
               dwStructSize: DWORD;
               dwSampleRate: DWORD;
               dwReSampleRate: DWORD;
            nMode: UINT;
               dwBitrate: DWORD;
               dwMaxBitrate: DWORD;
               nPreset: UINT;
               dwMpegVersion: DWORD;
               dwPsyModel: DWORD;
               dwEmphasis: DWORD;
               bPrivate: BOOL;
               bCRC: BOOL;
               //bCopyright: BOOL;
               bOriginal: BOOL;
               bWriteVBRHeader: BOOL;
               bEnableVBR: BOOL;
               nVBRQuality: INT;
               dwVbrAbr_bps: DWORD;
               bNoRes: BOOL;
            //BYTE         btReserved[255-2*sizeof(DWORD)];
          end);
        2: (aac: record
               dwSampleRate: DWORD;
               byMode: BYTE;
               wBitrate: WORD;
               byEncodingMethod: BYTE;
          end);
    end;
  end;
Der Compiler markiert hier die Zeile "//bCopyright: BOOL;" rot (zu beachten ist, das es sich hierbei um einen Kommentar handelt!)
Wie kann das sein? Bug im Compiler?

http://www.buzka.de/jo2.JPG

2: Wie kann ich folgende Zeile innerhalb eines Records in Delphi umsetzen:

Delphi-Quellcode:
BYTE         btReserved[255-2*sizeof(DWORD)];
? in Delphi ist SizeOf() ja eine Funktion, die kann ich da ja kaum anwenden oder?

ste_ett 17. Feb 2006 10:14

Re: Diese C++ Struktur in Delphi?
 
Bei mir meckert der Compiler nur über "nVBRQuality: INT;".
Mit "nVBRQuality: Integer;" geht es.


Zitat:

Zitat von Pseudemys Nelsoni
2: Wie kann ich folgende Zeile innerhalb eines Records in Delphi umsetzen:

Delphi-Quellcode:
BYTE         btReserved[255-2*sizeof(DWORD)];
? in Delphi ist SizeOf() ja eine Funktion, die kann ich da ja kaum anwenden oder?

Doch, das geht, da du sizeof() auf eine Konstante, bzw. auf einen fest deklarierten Type anwendest. :)

Delphi-Quellcode:
btReserved: array[0..255-2*sizeof(DWORD)-1] of Byte;

NicoDE 17. Feb 2006 10:16

Re: Diese C++ Struktur in Delphi?
 
Zitat:

Zitat von Pseudemys Nelsoni
Der Compiler markiert hier die Zeile "//bCopyright: BOOL;" rot (zu beachten ist, das es sich hierbei um einen Kommentar handelt!)
Wie kann das sein? Bug im Compiler?

Einige Compiler-Versionen mögen keine Zeilenkommentare innerhalb von varianten Strukturen (versuch's mit einem Blockkommentar: {...} ).

Zitat:

Zitat von Pseudemys Nelsoni
2: Wie kann ich folgende Zeile innerhalb eines Records in Delphi umsetzen:

Delphi-Quellcode:
BYTE         btReserved[255-2*sizeof(DWORD)];

Delphi-Quellcode:
btReserved: array [0..255 - 2 * SizeOf(DWORD) - 1] of BYTE;

Pseudemys Nelsoni 17. Feb 2006 10:22

Re: Diese C++ Struktur in Delphi?
 
Danke euch zwei zu 2. :]

Zu ersterem:

Ich habe die Zeile versucht auszukommentieren, weil der Compiler den gleichen Fehler, auch ohne "//" anzeigt. Ich sehe dort aber kein Fehler. Das heisst an der auskommentierung selbst kann es nicht liegen.

Dank euch sieht der Code derzeit so aus:

Delphi-Quellcode:
  PBE_CONFIG = ^BE_CONFIG;
  BE_CONFIG = record
     dwConfig: DWORD;
    format: record
      case Integer of
        0: (mp3: record
                 dwSampleRate: DWORD;
              byMode: BYTE;
               wBitrate: WORD;
               bPrivate: BOOL;
               bCRC: BOOL;
               bCopyright: BOOL;
               bOriginal: BOOL;
          end);
        1: (LHV1: record
                 dwStructVersion: DWORD;
               dwStructSize: DWORD;
               dwSampleRate: DWORD;
               dwReSampleRate: DWORD;
            nMode: UINT;
               dwBitrate: DWORD;
               dwMaxBitrate: DWORD;
               nPreset: UINT;
               dwMpegVersion: DWORD;
               dwPsyModel: DWORD;
               dwEmphasis: DWORD;
               bPrivate: BOOL;
               bCRC: BOOL;
               bCopyright: BOOL;
               bOriginal: BOOL;
               bWriteVBRHeader: BOOL;
               bEnableVBR: BOOL;
               nVBRQuality: INT;
               dwVbrAbr_bps: DWORD;
               bNoRes: BOOL;
                                  btReserved: array [0..255-2*sizeof(DWORD)-1] of BYTE;
          end);
        2: (aac: record
               dwSampleRate: DWORD;
               byMode: BYTE;
               wBitrate: WORD;
               byEncodingMethod: BYTE;
          end);
    end;
  end;
Ich benutze Delphi7 Personal.

Kann jemand den Fehler nachvollziehen?

NicoDE 17. Feb 2006 10:30

Re: Diese C++ Struktur in Delphi?
 
Zitat:

Zitat von Pseudemys Nelsoni
Kann jemand den Fehler nachvollziehen?

Mit Delphi 6 nicht nachvollziehbar...
Delphi-Quellcode:
type
  PBE_CONFIG = ^BE_CONFIG;
  BE_CONFIG = record
    dwConfig: DWORD;
    format : record
      case Integer of
        0: (
          mp3: record
            dwSampleRate: DWORD;
            byMode     : BYTE;
            wBitrate   : WORD;
            bPrivate   : BOOL;
            bCRC       : BOOL;
            bCopyright : BOOL;
            bOriginal  : BOOL;
          end);
        1: (
          LHV1: record
            dwStructVersion: DWORD;
            dwStructSize  : DWORD;
            dwSampleRate  : DWORD;
            dwReSampleRate : DWORD;
            nMode         : UINT;
            dwBitrate     : DWORD;
            dwMaxBitrate  : DWORD;
            nPreset       : UINT;
            dwMpegVersion : DWORD;
            dwPsyModel    : DWORD;
            dwEmphasis    : DWORD;
            bPrivate      : BOOL;
            bCRC          : BOOL;
            bCopyright    : BOOL;
            bOriginal     : BOOL;
            bWriteVBRHeader: BOOL;
            bEnableVBR    : BOOL;
            nVBRQuality   : Integer; // INT
            dwVbrAbr_bps  : DWORD;
            bNoRes        : BOOL;
            btReserved    : array [0..255 - 2 * SizeOf(DWORD) - 1] of BYTE;
          end);
        2: (
          aac: record
            dwSampleRate   : DWORD;
            byMode         : BYTE;
            wBitrate       : WORD;
            byEncodingMethod: BYTE;
          end);
    end;
  end;
Du solltest dir abgewöhnen Tabulatoren in deinem Quellcode zu verwenden...

Pseudemys Nelsoni 17. Feb 2006 11:00

Re: Diese C++ Struktur in Delphi?
 
Ahhh danke Nico... Der Fehler mit dem "Boolean" kam, weil ich dort "INT" statt "Integer" stehen hatte.... Komisch nur das es ihn ganz woanders anzeigt ;).

Besten Dank^^

PS: Ich habe die Feldnamen aus einer Cpp header datei kopiert, daher sind da noch ein paar Tabulatoren drinne, ich selbst nutze keine ;)


Edit: WIeso kam bei dem Array eigentlich noch ein "-1" ?

Question_mark 17. Feb 2006 21:18

Re: Diese C++ Struktur in Delphi?
 
Hallo Leute,
der geniale Nicolaus Wirth hat natürlich auch die "Union" in Pascal eingeführt (ich beziehe mich jetzt auf den ersten Beitrag in diesem Thread). Borland hat diese Struktur schon seit TP 1.0 ebenfalls, sogar bis heute noch in Delphi. :freak:
Ist natürlich wie so viele Features in Delphi, wie wir es leider von Borland gewohnt sind, miserabel dokumentiert (nämlich überhaupt nicht :roll: ).
Tatsächlich lässt sich ein Union auch in Delphi deklarieren und erlaubt dem Proggie den sauberen Typecast auf einzelne Recordelemente.

Gruss
Question_mark

PS : Bitte nicht mit dem "UNION" von SQL verwechseln, aber die Leute von der C-Fraktion werden mich schon verstanden haben :coder2:

NicoDE 18. Feb 2006 08:08

Re: Diese C++ Struktur in Delphi?
 
Zitat:

Zitat von Question_mark
Hallo Leute,
der geniale Nicolaus Wirth hat natürlich auch die "Union" in Pascal eingeführt (ich beziehe mich jetzt auf den ersten Beitrag in diesem Thread). Borland hat diese Struktur schon seit TP 1.0 ebenfalls, sogar bis heute noch in Delphi. :freak:
Ist natürlich wie so viele Features in Delphi, wie wir es leider von Borland gewohnt sind, miserabel dokumentiert (nämlich überhaupt nicht :roll: ).
Tatsächlich lässt sich ein Union auch in Delphi deklarieren und erlaubt dem Proggie den sauberen Typecast auf einzelne Recordelemente.

Könntest du deine These bitte mit einem Quellcode-Beispiel stützen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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