BSDForen.de  

Zurück   BSDForen.de > Geekstuff > Programmieren

Antwort
 
Themen-Optionen Thema bewerten Ansicht
Alt 17.10.2012, 15:37   #1
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 983
Herakles eine Nachricht über ICQ schicken
Question [C]Nested structs von variablem Typ

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

Geändert von Herakles (17.10.2012 um 15:51 Uhr). Grund: Rechtschreibfehler
Herakles ist offline   Mit Zitat antworten
Alt 17.10.2012, 16:21   #2
thorsten1
Registered User
 
Registrierungsdatum: Jul 2004
Beiträge: 117
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
thorsten1 ist offline   Mit Zitat antworten
Alt 17.10.2012, 16:36   #3
Kamikaze
Parasprite
 
Benutzerbild von Kamikaze
 
Registrierungsdatum: May 2005
Ort: /Earth/Europe/Germany/Karlsruhe
Beiträge: 9.636
Kamikaze eine Nachricht über ICQ schicken Kamikaze eine Nachricht über MSN schicken
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.
__________________
[ bsdlogo 2.0 - Wiki - Ports - LibreOffice Pakete - PM schreiben - kamikaze@bsdforen.de ]
Disclaimer: My posts represent my perception. Errors and incompleteness are to be expected, I deny any responsibility to know everything.
Kamikaze ist offline   Mit Zitat antworten
Alt 17.10.2012, 23:26   #4
Crest
rm -rf /*
 
Registrierungsdatum: Jun 2008
Ort: Bremen
Beiträge: 1.076
Herakles: Hast du man darüber nachgedacht einfach ein gutes Buch zu C zu kaufen und zu lesen?
Crest ist offline   Mit Zitat antworten
Alt 17.10.2012, 23:31   #5
Kamikaze
Parasprite
 
Benutzerbild von Kamikaze
 
Registrierungsdatum: May 2005
Ort: /Earth/Europe/Germany/Karlsruhe
Beiträge: 9.636
Kamikaze eine Nachricht über ICQ schicken Kamikaze eine Nachricht über MSN schicken
Zitat:
Zitat von Crest Beitrag anzeigen
Herakles: Hast du man darüber nachgedacht einfach ein gutes Buch zu C zu kaufen und zu lesen?
So was habe ich noch nie gesehen.
__________________
[ bsdlogo 2.0 - Wiki - Ports - LibreOffice Pakete - PM schreiben - kamikaze@bsdforen.de ]
Disclaimer: My posts represent my perception. Errors and incompleteness are to be expected, I deny any responsibility to know everything.
Kamikaze ist offline   Mit Zitat antworten
Alt 18.10.2012, 09:13   #6
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 983
Herakles eine Nachricht über ICQ schicken
@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
Herakles ist offline   Mit Zitat antworten
Alt 18.10.2012, 10:01   #7
Kamikaze
Parasprite
 
Benutzerbild von Kamikaze
 
Registrierungsdatum: May 2005
Ort: /Earth/Europe/Germany/Karlsruhe
Beiträge: 9.636
Kamikaze eine Nachricht über ICQ schicken Kamikaze eine Nachricht über MSN schicken
Zitat:
Zitat von Herakles Beitrag anzeigen
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.
Und genau dafür ist das Forum da.

Das ist zumindest meine Sicht der Dinge.
__________________
[ bsdlogo 2.0 - Wiki - Ports - LibreOffice Pakete - PM schreiben - kamikaze@bsdforen.de ]
Disclaimer: My posts represent my perception. Errors and incompleteness are to be expected, I deny any responsibility to know everything.
Kamikaze ist offline   Mit Zitat antworten
Alt 18.10.2012, 15:49   #8
dettus
Bicycle User
 
Benutzerbild von dettus
 
Registrierungsdatum: Aug 2004
Ort: nuernberg
Beiträge: 2.532
union. ganz einfach union.
__________________
Computer science is not about using a computer. It is about unleashing its powers.
dettus ist offline   Mit Zitat antworten
Alt 18.10.2012, 21:04   #9
laemodost
FreeBSD User
 
Registrierungsdatum: May 2003
Ort: Düsseldorf
Beiträge: 1.704
laemodost eine Nachricht über ICQ schicken
Zitat:
Zitat von Herakles Beitrag anzeigen
n. Da ich nur wenige Möglichkeiten haben, mich fachgerecht mit Kollegen auszutauschen, [...]

Das Problem kenne ich...
laemodost ist offline   Mit Zitat antworten
Alt 18.10.2012, 21:05   #10
Crest
rm -rf /*
 
Registrierungsdatum: Jun 2008
Ort: Bremen
Beiträge: 1.076
Okay sorry ich war gerade von faulen Kommilitonen gestresst.
Crest ist offline   Mit Zitat antworten
Antwort


Dieses Thema betrachten zurzeit 1 Personen. (0 registrierte Benutzer und 1 Gäste)
 
Themen-Optionen
Ansicht Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.


Powered by vBulletin (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.