Konwersja typu Union z C do Delphi

Odpowiedz Nowy wątek
2006-12-02 22:57

Rejestracja: 13 lat temu

Ostatnio: 10 lat temu

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 narazie 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 :).

Pozostało 580 znaków

2006-12-02 23:32

Rejestracja: 16 lat temu

Ostatnio: 10 lat temu

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.


<font color="red">Konto porzucone</span>

Dzięki wszystkim forumowiczom za lata wspólnych dyskusji; miłej zabawy w programowanie!
Sławomir 'Szczawik' Włodkowski

Pozostało 580 znaków

2006-12-02 23:44

Rejestracja: 13 lat temu

Ostatnio: 10 lat temu

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 );
Niema on nazw parametrow ale sa zdefiniowane typy parameterow (zreszta widac). I w konwersji na Delphi niewiem jak to ma byc Dobrze skonwertowane. Dzieki.

Pozostało 580 znaków

Odpowiedz

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