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