Konwersja typu Union z C do Delphi

0

Witam. Chce skonwertowac kod ponizej na Delphi

typedef enum
{
    HL_ATTRIBUTE_INVALID = 0,
    HL_ATTRIBUTE_BOOLEAN,
    HL_ATTRIBUTE_INTEGER,
    HL_ATTRIBUTE_UNSIGNED_INTEGER,
    HL_ATTRIBUTE_FLOAT,
    HL_ATTRIBUTE_STRING
} HLAttributeType;

typedef struct
{
    HLAttributeType eAttributeType;
    hlChar lpName[252];
    union
    {
        struct
        {
            hlBool bValue;
        } Boolean;
        struct
        {
            hlInt iValue;
        } Integer;
        struct
        {
            hlUInt uiValue;
            hlBool bHexadecimal;
        } UnsignedInteger;
        struct
        {
            hlFloat fValue;
        } Float;
        struct
        {
            hlChar lpValue[256];
        } String;
    } Value;
} HLAttribute;

i moim zdaniem ma to byc tak w Delphi

type
  HLAttributeType =(
      HL_ATTRIBUTE_INVALID,
      HL_ATTRIBUTE_BOOLEAN,
      HL_ATTRIBUTE_INTEGER,
      HL_ATTRIBUTE_UNSIGNED_INTEGER,
      HL_ATTRIBUTE_FLOAT,
      HL_ATTRIBUTE_STRING);

  HLAttribute = record
    lpName : array[0..252-1] of Char;
    case eAttributeType : HLAttributeType of
      1: (bValue : Boolean);
      2: (iValue : Integer);
      3: (uiValue : LongWord; bHexadecimal : Boolean);
      4: (fValue : Single);
      5: (sValue : string[255]);
  end;

Powiedzcie czy to jest ok bo jak na razie nie zabordzo mam jak sprawdzic :/ . I chcialbym jeszcze (jak to mozliwe) zeby w case moglem wybrac jak w C. Juz tlumacze o co chodzi ;-) .

W C dostep do wartosci uzyskuje tak "eAttributeType.Value.UnsignedInteger.bHexadecimal", a
w Delphi prawdopodobnie "eAttributeType.bHexadecimal" (choc nie jestem pewien).

Tak jest chyba tez dobrze ale zalezy mi na wygladzie tez takze prosze o pomoc :).

0

Jest:

HLAttribute = record

Polecam raczej:

HLAttribute = packed record

Może okazać się, że pierwsze wymusza niewłaściwe wyrównanie pól rekordu.

Aby wybierać tak jak w C, musiałbyś stworzyć pośrednie definicje rekordów, a w części case użyć typu takiego rekordu pośredniego.

0

moze byc jeszcze tak (i chyba lepiej jest)

  HLAttribute = packed record
    lpName : array[0..252-1] of Char;
    case eAttributeType : HLAttributeType of
      1: (Boolean_: record
            bValue : Boolean;
          end);
      2: (Integer_: record
            iValue : Integer;
          end);
      3: (UnsignedInteger_: record
            uiValue : LongWord;
            bHexadecimal : Boolean;
          end);
      4: (Float_: record
            fValue : Single;
          end);
      5: (String_: record
            sValue : string[255];
          end);
  end;

Dzieki.

Kolejne pytanie (zeby nie robic kolejnego tematu)

Jak skonwertowac taki type?
typedef bool (POpenProc) (int, void );
NIE MA on nazw parametrow ale sa zdefiniowane typy parameterow (zreszta widac). I w konwersji na Delphi niewiem jak to ma byc Dobrze skonwertowane. Dzieki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0