[C]Nested structs von variablem Typ

Herakles

Profifragensteller
Moin!

Ich habe ein struct, in dem zwei verschiedene nested structs stecken können. Voll ausgefüllt könnte das struct in zwei Varianten auftreten:

1.
Code:
struct toll {
    int a;
    struct super z;
    int b;
}

2.
Code:
struct toll {
    int a;
    struct klasse y;
    int b;
}

Es gäbe also einmal ein nested struct, dass vom Typ "struct super" ist, und einmal vom Typ "struct klasse". Alle anderen Daten im "struct toll" bleiben aber identisch. Ich möchte beide Typen zur Verfügung haben.

Nun könnte man natürlich sagen "mach einfach zwei verschiedene structs, eins heißt "toll_1" und eins "toll_2" - aber eben genau das möchte ich nicht, ich möchte vielmehr wissen, ob es eine Möglichkeit gibt, den Teil des nested struct variabel zu halten.

Mach ich sowas vielleicht mit einem Pointer:

Code:
struct toll {
    int a;
    void *x;
    int b;
}

Allerdings könnte ich dann bei "sizeof()"-Abfragen immer ins Leere greifen oder müsste das entsprechende nested struct immer mühsam hinzuaddieren.

Wie also macht man's elegant? Ist die Lösung tatsächlich, zwei Strukturen anzulegen oder gibt es eine Lösung ohne Codedopplung?

Viele Grüße
Herakles
 
Zuletzt bearbeitet:
Muss es unbedingt reines C sein? Falls Du auch C++ nutzen kannst/darfst, könntest Du ein Template benutzen, also

template <typename T> struct toll {
int a;
T y;
int b;
};

Willst Du eine Variable anlegen, musst Du das Template mit dem gewünschten Datentyp spezialisieren, also
toll<super> variable1;
bzw.
toll<klasse> variable2;

Näheres zu templates gibts z.B. unter www.willemer.de/informatik/cpp/cpptempl.htm
 
Du kannst das mit union machen. Da ist aber der Hinweis notwendig, dass die größe des union immer vom größeren struct abhängt und, du hast dann keine Typsicherheit zwischen den Typen. D.h. du musst wissen was da drin ist, das unterscheided dein Compiler nicht für dich.

Code:
struct toll {
    int a;
    union {
        struct klasse y;
        struct super z;
    };
    int b;
};

Der Zugriff sieht dann etwa so aus:
Code:
stuct toll a;
a.y.foo = 1;
a.z.bar = 2;

Wobei du in dem Anwendungsfall gemischte Zugriffe auf jeden Fall unterlassen solltest. Da kommt munteres Datenpotpourris bei raus.
 
@Crest:

Ich besitze sehr wohl ein C-Buch, mehrere sogar. Das, was ich als Nachschlagewerk nutze, ist "C von A bis Z" von Jürgen Wolf. In meinen Augen eigentlich ein gutes Buch, aber ich stoße dennoch immer wieder an dessen Grenzen. Da ich nur wenige Möglichkeiten haben, mich fachgerecht mit Kollegen auszutauschen, nutze ich gern dieses Forum, um Lösungen für knifflige Fachfragen zu haben. Da ich hier eine große Community wirklich guter Programmierer habe, frage ich eben gern hier nach.

Ich hatte nich gedacht, dass das jemanden stören könnte. Schließlich sind die Infos hier für jedermann ersichtlich und bringt evtl. auch andere "Mitleser" weiter...

Grüße
Herakles
 
Zurück
Oben