2009-08-16 12 views
1

J'écris un vecteur en C. La fonction CVectorSearch utilise bsearch si elle est triée, et lfind si elle n'est pas triée. Pourquoi est-ce que j'obtiens l'avertissement "assignation fait un pointeur d'entier sans un cast" quand j'appelle lfind? Il semble fonctionner même lorsque lfind est utilisé.pointeur d'entier sans avertissement cast lors de l'appel de lfind

typedef struct 
{ 
    void *elements; 
    int logicalLength; 
    int allocatedLength; 
    int elementSize; 
} CVector; 

typedef void (*CVectorFreeElemFn)(void *elemAddr); 


int CVectorSearch(const CVector *v, const void *key, 
      CVectorCmpElemFn comparefn, 
      int startIndex, bool isSorted) 
{ 

    void * found; 
    int elemSize = v->elementSize; 
    int length = v->logicalLength; 
    void *startAddress = (char*)v->elements + startIndex*elemSize; 

    if(isSorted) 
     found = bsearch(key, startAddress, length, elemSize, comparefn); 
    else 
     found = lfind(key, startAddress, &length, elemSize, comparefn); 


    if(found) 
     return ((char*)found - (char*)v->elements)/elemSize; 
    else 
     return -1; 
} 

modifier: Maintenant que j'ai inclus search.h je reçois:

warning: passing argument 3 of 'lfind' from incompatible pointer type 

Le programme fonctionne toujours correctement, cependant.

Répondre

1

Le troisième argument de lfind() est un pointeur vers size_t et non int lorsque vous passez. Le type size_t peut être d'une taille différente de int sur certaines architectures (en particulier x86-64) et il est également non signé. Vous devez changer le type de la variable length.

4

Avez-vous inclus <search.h> qui définit lfind? Si une fonction est appelée sans prototype, votre compilateur peut supposer qu'elle renvoie int.

0

Je ne pense pas que les questions ci-dessus résolvent vraiment le problème car j'ai eu ce problème. La vraie réponse, je crois, est la distinction entre le prototype de bsearch et le prototype de lfind. Nous allons Takea regarder

void *bsearch(const void *key, const void *base, size_t nmemb, 
       size_t size, int (*compar)(const void *, const void *)); 

Versus

void *lfind(const void *key, const void *base, size_t *nmemb, 
       size_t size, int(*compar)(const void *, const void *)); 

Si vous remarquerez que le troisième paramètre de la fonction lfind est un pointeur sur un size_t de type non (comme dans la fonction bsearch) une valeur copiée directe .

Assurez-vous simplement que vous passez l'adresse de la taille et tout ira bien.