Dummydatentyp in C
-
Moin Moin
ich versuche gerade eine doppelt verkettete Liste zu erstellen, die ich gerne
in späteren Projekten wiederverwenden möchte. Dafür ist es mir wichtig, dass
die Liste keine speziellen Datentypen zum beispiel Integer-Werte erwartet.gibt es in C die möglichkeit so einen Dummydatentypen selbst anzulegen? oder gibt es ganz andere ansätze?
Grüße
Martin
-
Dafür gibt es typedef:
typedef nodedata_t int;
und schon hast du einen neuen abstrakten Datentyp, den du später im Header ändern kannst.
Natürlich könnte man auch etwas mit Makros zusammenbauen, aber ich sehe dazu keinen Grund, weil das die Sprache schon eingebaut hat.
-
Üblicherweise nimmt man in dem Fall einen
void*
(und ein Flag für den Typ) oder man "simuliert" Templates über Macros.@µngbd
dein typedef ist falschrum.
-
mhhh also typedef scheint an sich schon ne gute richtug zu sein. rüdigers antwort sagt mir leider nichts weil mit templates und macros noch nix sagen und auch der void* mit Flag für den Typ hilft mir irgendwie nich weiter. Das ist noch zu abstrakt für mich (lern seit 3 tagen C).
Allerdings frage ich mich bei typedef wie das aussieht, wenn ich in einem programm dann zwei listen mit unterschiedlichen typen haben will... geht das? also eine int liste und eine char liste zum beispiel?
(ich werd aber selbst auch noch mal weiter typedef googlen^^)
EDIT: hab mir typedef mal genauer angeguckt und irgendie scheint das doch nicht zu sein was ich brauche. so wie ich das verstanden habe, erstellt man mit typedef schon spezielle sachen die nur anders heißen.
ich bräuchte aber ne variable, die sowohl int werde wie auch char werte oder ganze structe speichern kann und wo ich erst beim zugriff dann ne typumwandlung in den gespeicherten typ vornemen muss.grüße
Martin
-
Martin Leurs schrieb:
gibt es in C die möglichkeit so einen Dummydatentypen selbst anzulegen?
als dummydatentyp werden z.b. gern void* genommen.
...oder gibt es ganz andere ansätze?
klar, z.b. eine listenverwaltung die man nachträglich in jede beliebige struct einfügen kann: http://www.c-plusplus.net/forum/viewtopic-var-t-is-160978-and-start-is-0.html
(6. posting von oben)
-
rüdiger schrieb:
@µngbd
dein typedef ist falschrum.Aber natürlich! Manche Dinge gewöhnt man sich nie ab.
Martin Leurs schrieb:
rüdigers antwort sagt mir leider nichts weil mit templates und macros noch nix sagen und auch der void* mit Flag für den Typ hilft mir irgendwie nich weiter. Das ist noch zu abstrakt für mich (lern seit 3 tagen C).
Templates sind ein Begriff aus der C++-Welt. Wenn du dich dort auch nicht auskennst, muss dir das nichts sagen. Aber die void-Zeiger kannst du recht einfach verstehen: das sind Zeiger auf einen beliebigen Typ. Manchmal holt man den Speicher für den Datenbereich eines Listenknotens mit malloc() und legt nur einen Zeiger in den Knoten. In dem Fall muss man sich noch irgendwie merken, welcher Datentyp gerade hinter dem Zeiger steckt, damit man entsprechend damit umgehen kann (casten oder solche Dinge).
Also im Prinzip so:
#define TYPE_INTEGER 0 #define TYPE_FOO 1 ... struct list_node { int type; void *pointer; struct list_node prev, next; }
Wenn man hier darauf achtet, dass man die passende Zahl in
type
speichert, weiss man immer, wie man mit dempointer
umgehen muss.
-
is ne idee nur mit zeigern auf die jeweiligen daten zu arbeiten. Ich denke so werd ichs mal versuchen
ich versuche aktuell nämlich all die Dinge die wir damals in Java gemacht haben jetzt in C umzusetzen, um mal die Denkweise ohne OOP zu kapieren.
jetz kommen also erst mal listen, dann Bäume dann Graphen etcGrüße
Martin
-
Nicht mein Tag heute...
Strukturen können sich natürlich nicht selbst enthalten.
-
µngbd schrieb:
Nicht mein Tag heute...
Strukturen können sich natürlich nicht selbst enthalten.Aber Pointer auf sich selbst - und das wolltest du wohl schreiben, oder
-
joa aus dem
struct list_node prev, next;
wird dann einfach
struct list_node *prev, *next;
dann lässt man halt einfach zeiger auf das nächste kettenglied zeigen
Grüße
Martin
-
rüdiger schrieb:
Üblicherweise nimmt man in dem Fall einen
void*
(und ein Flag für den Typ) oder man "simuliert" Templates über Macros.Man benötigt nur einen void* der auf den entsprechenden Knoten zeigt, sowie die Angabe über die Größe der Struktur.
Dann kann man für jeden beliebigen Record eine doppelt verkettete Liste erstellen. Interpretation liegt ja nicht in der Aufgabe der Liste selbst.