2010-08-31 7 views
2

i ont les parties de code suivant:erreur: pointeur déréférencement de type incomplet

typedef struct Object* ObjectP; 

ObjectP CreateObject(void *key) { 

    printf("GOT %d\n",(*(int*) key)); 
    ObjectP objP = (ObjectP) malloc(sizeof(Object)); 
    if (objP == NULL) { 
     //TODO ReportError(MEM_OUT); 
     return NULL; 
    } 
    objP->_key = key; 
    objP->_next = NULL; 
    objP->_numInChain = 1; 

    return objP; 

}

typedef struct Object { 
    ObjectP _next; 
    void* _key; 
    int _numInChain; 
} Object; 

et dans un autre fichier:

void IntPrint(const void *key) { 
    assert(key != NULL); 
    printf("%d",*((const int*)key)); 
} 

et dans un autre fichier que j'ai le principal():

int main(int argc, char* argv[]) { 
int* key = (int*) malloc(sizeof(int)); 
*key = 20; 
ObjectP a = CreateObject(key); 
IntPrint(a->_key); //THIS DOESN'T COMPILE 
return 0; 
} 

IntPrint ne compile pas. il écrit:
erreur: pointeur de déréférencement au type incomplet
et je ne peux pas comprendre pourquoi, parce que IntPrint reçoit void * et une touche -> _ est également vide *.

Merci!

+0

Avez-vous envoyé les pièces de code dans l'ordre où elles ont été compilées? –

Répondre

3

Vous avez posté un tas de morceaux de code pratiquement non pertinents, mais omis le plus important: qu'est-ce que ObjectP et comment est-il défini? Le compilateur vous indique qu'il est défini comme un pointeur vers un type incomplet. C'est ton problème. Ce qui ne va pas avec la définition est impossible à dire sans vraiment le voir.

Après l'édition: Votre problème est que la définition de struct Object n'est pas visible au moment où vous essayez d'accéder a->key (in.e. à main). Vous avez oublié de l'inclure ou quelque chose comme ça. Est-ce que la définition de struct Object se trouve dans le même fichier que la définition de ObjectP?

+1

désolé, je vais modifier tout de suite – Mike

2

Où avez-vous défini ObjectP? Je suggère de ne pas déclarer avant l'objet est entièrement défini:

typedef struct Object { 
    struct Object* _next; 
    void* _key; 
    int _numInChain; 
} Object; 

typedef Object* ObjectP; 

De cette façon, il devrait être toujours sûr à utiliser ObjectP. Cependant, sans que vous postiez plus de code, ce n'est qu'une supposition aveugle.

+0

Je ne pense pas que ce soit le problème. typedef ObjectP est défini dans GenericHashMap.h (dans l'en-tête) et l'objet struct est défini dans GenericHashMap.c .. j'inclus l'en-tête au début. – Mike

+2

@Asher: Eh bien, c'est votre problème. Vous avez défini 'struct Object' dans un fichier .c, il n'est donc pas visible pour votre fonction' main'. Vous obtenez donc une erreur de type incomplète, comme vous le devriez. (Je suppose que la fonction 'main' est dans un fichier .c différent). – AnT

0

Effectuez les opérations suivantes dans votre fonction main:

IntPrint((const void *) a->_key); 

La définition de _key dans la structure Object ne pas le modificateur constant et qui pourrait provoquer un avertissement ou une erreur selon les drapeaux que vous utilisez lors de la compilation.

Questions connexes