Autor Beitrag
sky21
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Do 18.06.09 10:31 
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?


ausblenden 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;
                  // ....



ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1338
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Do 18.06.09 12:34 
Das ist eigentlich ganz Simpel:

ausblenden 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.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 18.06.09 17:23 
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:

ausblenden 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;

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."