2009-08-16 9 views
1

Ich schreibe einen Vektor in C. Die CVectorSearch-Funktion verwendet bsearch, wenn es sortiert ist, und lfind, wenn es unsortiert ist. Warum bekomme ich die Warnung "Zuweisung macht Zeiger aus Ganzzahl ohne Besetzung", wenn ich lfind anrufe? Es scheint gut zu funktionieren, auch wenn lfind verwendet wird.Zeiger von Ganzzahl ohne Cast Warnung beim Aufruf 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; 
} 

edit: Jetzt, wo ich search.h enthalten habe ich erhalte:

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

Das Programm immer noch richtig, obwohl arbeitet.

Antwort

1

Das dritte Argument zu lfind() ist ein Zeiger auf size_t nicht int, wie Sie übergeben werden. Der size_t Typ kann eine andere Größe als int auf einigen Architekturen haben (insbesondere x86-64) und es ist auch nicht signiert. Sie müssen den Typ der Variablen length ändern.

4

Haben Sie <search.h> eingeschlossen, die lfind definiert? Wenn eine Funktion ohne einen Prototyp aufgerufen wird, kann Ihr Compiler davon ausgehen, dass es int zurückgibt.

0

Ich glaube nicht, dass die obigen Fragen das Problem wirklich lösen, da ich dieses Problem hatte. Die wahre Antwort, glaube ich, ist die Unterscheidung zwischen bsearch Prototyp und lfind Prototyp. Lassen Sie uns

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 *)); 

aussehen takea Wenn Sie, dass der dritte Parameter der lfind Funktion auffallen wird, ein Zeiger auf eine size_t ist der Typ nicht (wie in der bsearch Funktion) direkt kopierten Wert .

Nur sicherstellen, dass Sie die Adresse der Größe übergeben und es wird gut.