Kadaj Geschrieben 10. März 2012 Geschrieben 10. März 2012 Hallo, mir geht grad folgendes Problem durch den Kopf: Bei einer doppelt verketteten Liste habe ich eine Struktur, die wie folgt aussieht: typedef struct Cnctr { struct Cnctr *pNxt; struct Cnctr *pPrv; void *pItem; }tCnct; typedef struct { tCnct *pFirst; tCnct *pCurr; tCnct *pLast; }tList; [/PHP] Diese Struktur steht beispielsweise in einer Datei list.h mit Vorwärtsdeklarationen für die list.c. Dass mein pItem vom Typ void ist, ist ja gewollt, da ich beispielsweise ein Programm mit Telefoneinträgen und später ein Konto-Programm damit schreiben möchte und immer diese Struktur verwenden möchte, ohne sie zu verändern. Nun habe ich in meiner list.c eine Funktion von folgender Struktur: [PHP] void* addItemToList (tList* pList, void * pItem, int(*fcmp)(void*pItList,void*pItNew)); Nun habe ich aber eine weitere Datei, konto.c zum Beispiel und von mir aus noch ein Konto.h mit den Deklarationen und auch mit meiner Struktur, die ich dem pItem zuweisen möchte. Die könnte so aussehen: void *addEntry(tList *pList); [/PHP] Nun hab ich mein Element und kann in der funktion: 1. ein neuen Pointer anlegen, der die Datenstruktur für mein Bank-Konto hat 2. Speicher mit malloc reservieren 3. dem pItem die Struktur zuweisen 4. das Item einordnen Doch hier steig ich gedanklich ein wenig aus. Ich würde einfach meine Funktion addItemToList aufrufen und ihr meine pList und mein pItem übergeben, was ich grad angelegt habe. Weil die Funktion addItemToList meine Struktur nicht kennt muss ich das Ergebnis des Vergleichs übergeben, welcher beispielsweise den Vergleich newItem->Name und pList-pCurr->pItem->Name ausführt. Aber genau hier ist das Problem. Mein newItem hätte das Element ->Name, weil ich es ja grade erst angelegt habe, aber mein pList->pCurr hat es nicht, weil es ja nur ein voird* ist. Aber wie mache ich meinem Programm an der Stelle sonst klar, dass alle pItems von der Struktur konto oder wie auch immer sind. Ist mein gedankliches Problem zu verstehen? Ich kann sonst leider nichts posten, weil das alles erstmal Überlegungen auf nem Blatt Papier sind. Kann mir vielleicht trotzdem jemand helfen? Zitieren
Klotzkopp Geschrieben 10. März 2012 Geschrieben 10. März 2012 Weil die Funktion addItemToList meine Struktur nicht kennt muss ich das Ergebnis des Vergleichs übergebenDu übergibst nicht das Ergebnis des Vergleichs. Du übergibst den Zeiger auf eine Funktion, die zwei Einträge vergleichen kann. Diese Funktion kennt deine Elemente natürlich. Die übergebene Funktion wird in addItemToList vermutlich mehrfach aufgerufen, um den neuen Eintrag richtig einzuordnen. Zitieren
Kadaj Geschrieben 10. März 2012 Autor Geschrieben 10. März 2012 Ja, so hatte ich mir das gedacht. Ich hab schon gefunden, was ich gesucht hatte: int fcmp(void *ele1,void *ele2) { return strcmp( ((tPhoneEntry*)ele1)->Name, ((tPhoneEntry*)ele2)->Name ); } [/PHP] Ich wusste nicht, dass ich dem Programm auf die Weise verklickern kann, dass ich dem eine bestimmte Struktur übergebe, da hab ich wohl mal geschlafen ^^ Vielen Dank! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.