On 03 Jan 2009, at 12:54, gabor wrote:

I'm trying to convert c header code from "Windows Mobile API 5" to pascal and I'm getting wrong size of converted record:

original c header:

typedef struct _DDPIXELFORMAT
{
   DWORD        dwSize;
   DWORD        dwFlags;
   DWORD        dwFourCC;
   union
   {
        DWORD   dwRGBBitCount;
        DWORD   dwYUVBitCount;
        DWORD   dwAlphaBitDepth;
   };
   union
   {
        DWORD   dwRBitMask;
        DWORD   dwYBitMask;
   };
[snip]
and my pascal conversion:

"union" in C means that the fields inside this union{..} block all start at the same address, but whatever comes after the union{} block follows all of those fields. Your translation does exactly the inverse: it makes all union blocks start at the same address, but puts the fields inside the union blocks after each other.

I don't think you can create sequential unnamed variant parts in Pascal records like the above C struct though, but you can get the same layout and usage by doing this:

PDDPixelFormat = ^TDDPixelFormat;
 _DDPIXELFORMAT = record
   dwSize: DWORD;
   dwFlags: DWORD;
   dwFourCC: DWORD;
   case Integer of
     0: (
         dwRGBBitCount : DWORD;
        );
     1: (
         dwYUVBitCount : DWORD;
        );
     2: (
         dwAlphaBitDepth : DWORD;
         case Integer of
          0: (
              dwRBitMask : DWORD;
             );
          1: (
              dwYBitMask : DWORD;
              case Integer of
                0: (
                    dwGBitMask : DWORD;
                   );
                1: (
                    dwUBitMask : DWORD;
                    case Integer of
                      0: (
                          dwBBitMask : DWORD;
                         );
                      1: (
                          dwVBitMask : DWORD;
                          case Integer of
                            0: (
                                dwRGBAlphaBitMask: DWORD;
                               );
                         );
                   );
             );
         );
   end;

In this case it's easy because in each union every field has the same size. If that weren't the case, you would have to put the nested variant parts after the largest field of each variant. Or you could put the variant parts in separate record types and then declare fields of these types (which is cleaner, but then when accessing the fields you will have to add the record field names).


Jonas
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to