Hallo,
ich habe ein Problem mit dem Casten von void-Pointern, die eigentlich auf Strukturen zeigen. Am Besten schildere ich mal kurz den Zusammenhang...
Es gibt eine Struktur:
typedef struct{ char *pName; char *pFirstName; char *pNumber; } tRecord;
Die Struktur stellt einen Datensatz eines Telefonverzeichnisses dar. �ber eine verkettete Liste werden die Datens�tze verwaltet und bereits bei der Eingabe alphabetisch geordnet. Der Listen- modul stellt daf�r folgende Funktion bereit:
void* addItemToList (tList* pList, void * pItem, int(*fcmp)(void*pItList,void*pItNew));
F�r int(*fcmp) wird ein Pointer auf eine Vergleichsfunktion er- wartet, die die entsprechende Syntax hat. Da die Liste keine Ahnung vom Typ der verwalteten Daten haben muss, werden dabei lediglich void-Pointer �bergeben. Mein Problem ist nun folgendes: Von addItemToList wird f�r jedes bereits in der Liste vorhandene Element vom Typ tRecord die Vergleichsfunktion RecordCompare aufgerufen.
int RecordCompare(void *pItList, void *pItNew) { return strcmp((tRecord*)(pItList->pName),(tRecord*)(pItNew->pName)); }
RecordCompare erh�lt also f�r seine beiden Parameter jeweils einen Pointer auf eine Struktur tRecord, die es vorl�ufig noch als void* betrachtet. Wie aus dem Quelltextschnipsel zu er- sehen ist, soll nichts weiter gemacht werden, als zwei Strings zu vergleichen. Die beiden void-Pointer habe ich also als tRecord gecastet und wollte so an die Zeichenketten pName herankommen. Aber der GCC gibt mir folgende Meldungen:
phon.c: In function `RecordCompare': phon.c:22: warning: dereferencing `void *' pointer phon.c:22: request for member `pName' in something not a structure or union phon.c:22: warning: dereferencing `void *' pointer phon.c:22: request for member `pName' in something not a structure or union make: *** [all] Error 1
Anscheinend habe ich mit dem Casting irgend etwas falsch ge- macht, der GCC erkennt die Struktur nicht als solche. Probiert habe ich bis jetzt alle m�glichen Klammerungen, komme aber nicht mehr weiter. Muss ich dem GCC zus�tzlich noch verklickern, dass "pName" ein char* ist oder wo muss ich ansetzen?
Viele Gr��e, Matthias