Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - von "C" union nach Delphi was?


sky21 - Do 18.06.09 10:31
Titel: von "C" union nach Delphi was?
Hi all

Ich habe C Strukturen, welche ich nach Delphi (v2005) portieren muss. Mit dem Code habe ich nun massiv Probleme, die Union abzubilden. Angeblich kann eine Union in ein Delphi-case umgeschrieben werden. Aber bisherige Erfolge blieben aus. wer weiss Rat?



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
struct MYPROJECT_NotificationVariant
{
  MYPROJECT_TYPE_Notify  eNotify;

  union
  {
                  MYPROJECT_STRUCT_SOMESTRUCT_1      _s1;
                  MYPROJECT_STRUCT_SOMESTRUCT_2      _s2;
                  MYPROJECT_STRUCT_SOMESTRUCT_3      _s3;
                  // ....




Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TMyProjectNotifyVariant = packed record
    eNotify : TMyProject_TYPE_Notify;
    // und jetzt? - 'case xx of' ?
end;



Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 18.06.2009 um 10:46


Sinspin - Do 18.06.09 12:34

Das ist eigentlich ganz Simpel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  MYPROJECT_STRUCT_SOMESTRUCT_1 = byte;
  MYPROJECT_STRUCT_SOMESTRUCT_2 = word;
  MYPROJECT_STRUCT_SOMESTRUCT_3 = integer;
  TMYPROJECT_NotificationVariant =
  record
    case integer of
      0 : (_s1: MYPROJECT_STRUCT_SOMESTRUCT_1);
      1 : (_s2: MYPROJECT_STRUCT_SOMESTRUCT_2);
      2 : (_s3: MYPROJECT_STRUCT_SOMESTRUCT_3);
    // vorsicht! in diesem fall ist es ganz richtig das den case das "end" fehlt
  end;

Was ganz genau rauskommen muss kann ich dir natürlich nicht sagen da du nicht die ganze Definition rausgerückt hast. Aber an dem obigen Beispiel müsstest du erkennen wie du weitermachen kannst.


Martok - Do 18.06.09 17:23

user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
// vorsicht! in diesem fall ist es ganz richtig das den case das "end" fehlt                    

Und an dieser Feststellung hängt noch mehr: der Variante Teil kann in Delphi-Records nur am Ende stehen. In C muss das nicht unbedingt so sein. Falls nach der UNION noch was kommt, und soll das Ergebnis binärkompatibel sein, muss man sich ein wenig behelfen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TVariantRec = packed record case byte of
  0: (SomeIntVar: Integer);
  1: (SomeDWORDVar: DWORD);
end;

TLargerRec = paced record
  ABool: Boolean;
  VariantPart: TVariantRec;
  SomethingElse: Integer;
end;