CreateList();
-
Also ich steh anscheinend grade echt aufm Schlauch. Ich soll eine doppelt verkette Liste schreiben und habe dazu die Prototypen bekommen.
Der sieht folgendermaßen aus:/* list.h */ /*------------------------------------------------------------------------*/ /* Datenstruktur eines Listenverbindungselementes */ typedef struct Cnctr { struct Cnctr *pNxt; /* Pointer auf naechstes Verbindungselement */ struct Cnctr *pPrv; /* Pointer auf vorheriges Verbindungselement */ void *pItem; /* Pointer auf Daten */ }tCnct; typedef tCnct tList; #define pCurr pItem #define pHead pNxt #define pTail pPrv #define OK 1 #define FAIL 0 /*-------------------------------------------------------------------------*/ /* Prototypen fuer die Funktionen */ tList * CreateList(void); /* erzeuge leere Liste */
Es geht um das CreateList. Ich muss doch eigentlich eine neue Struktur, oder einen Pointer auf diese neue Struktur einrichten. Dann werden die Werte *pHead,*pTail,*pCurr, die durch
#define pCurr pItem
#define pHead pNxt
#define pTail pPrvja gleich bedeutend mit *pNext,*pItem,*pPrv sind, automatisch mit NULL initialisert und fertig.
Dazu hab ich folgendes geschrieben:
#include "list.h" #include <malloc.h> /* erzeugt eine leere Liste und gibt Zeiger auf sie zurück */ tList* CreateList(void) { tList* pList; pList = malloc(sizeof(tList)); return pList; }
und zum testen:
#include "list.h" #include "list_fkt.h" int main() { tList* pList; pList = CreateList(); return 0; }
Jetzt bekomme ich den Fehler:
list\list.h(6) : error C2011: 'Cnctr' : 'struct'-Typ-NeudefinitionWer cool, wenn mir erstmal jemand nen Denkanstoß verpasst, wo mein Denkfehler liegt und nicht gleich den Code postet, denn da lern ichs ja nie.
thx
-
Wenn das ganz oben der komplette Codeauszug aus deiner list.h ist, dann wundert es mich nicht.
Du includierst die list.h zweimal, also hast du ja schon einmal die Deklaration.
Gegenmaßnahme:
irgendeine.h
#ifndef IRGENDEINE_H //wenn irgendeine_h noch nicht definiert wurde #define IRGENDEINE_H "irgendeine.h" //definiere irgendeine_h ... //Deklarationen der Headerdatei #endif
Wenn du die Headerdatei nun ein zweites mal includierst, dann erkennt der Compiler bzw. Präprozessor, dass die Datei bereits einmal includiert wurde, da IRGENDEINE_H bereits definiert ist.
-
Danke, das problem hab ich gelöst.
Es muss einem aber auch erstmal gesagt werden, dass man eine .h nicht doppelt einbinden darf. :pAber noch etwas anderes: ich habe ja oben in den Struktur den Zeiger auf void pItem, der im Falle des Listenkopfes zu pCurr wird. Wenn ich ihn verwenden möchte (z.B. pList->pCurr->pPrv=pTmp;) brache ich ja aber einen tList* sonst bekomme ich die Fehlermeldung, dass der linle Teil von pPrv nicht auf eine Struktur zeigt. Wie kann ich den Pointertyp konvertieren?
Sicher mit (tList
pCurr, oder? Nur wo und wie genau?
Mit Markos kenn ich mich nämlich noch net aus. und direkt vor der Verwendung *(pList->(pList )pCurr->pPrv=pTmp geht es auch nicht.
-
Also ich verstehe nicht auf was du genau hinauswillst. Erklär bitte nochmal was du genau machen möchtest (am besten inklusive den Datenstrukturen, die du dabei verwenden möchtest).
-
Ist halb so wild, hab das Problem inzwischen selber lösen können.
Das Problem war, dass ich den void* pCurr dereferenizieren wollte, was ja nun einmal nicht möglich ist, siehe oben. Hab dann einfach einen tCnct* pTmp dafür verwendet und dieser lässt sich ja bekanntlich dereferenzieren.Wundert mich übrigens nicht, dass Du mit der Frage nix anfangen konntest, schließlich hab ich oben nur einen Teil der list.h gepostet. Da standen noch wesentlich mehr Funktionen drin, die wir realisieren sollten. Da diese aber für meine erste Frage mit der CreateList() nicht von Bedeutung waren, hab ich sie einfach weggelassen. Das zweite problem ist dann beim Schreiben einer anderen Fkt. aufgetreten, die halt net oben steht, für die ich aber den void* Curr dereferenzieren wollte. Meine Frage war, ob es dafür auch eine Art typecast wie für die Zahlen gibt?!