puntatore dalla intero w / o di avvertimento quando si chiama fusione lfind
Domanda
Sto scrivendo un vettore in funzione di C. La CVectorSearch usa bsearch se è ordinato, e lfind se è non differenziati. Perché mi appare il messaggio di avviso "Assegnazione fa puntatore da interi senza un cast" quando sto chiamando lfind? Sembra funzionare bene anche quando si utilizza 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;
}
modifica Ora che ho incluso search.h sto ottenendo:
warning: passing argument 3 of 'lfind' from incompatible pointer type
Il programma è ancora funziona correttamente, però.
Soluzione
Il terzo argomento di lfind () è un puntatore a size_t
non int
come si sta passando. Il tipo size_t
può essere di dimensioni diverse rispetto int
su alcune architetture (particolarmente x86-64) ed è anche senza segno. È necessario cambiare il tipo di variabile length
.
Altri suggerimenti
È stato incluso <search.h>
che definisce lfind
? Se una funzione viene chiamata, senza un prototipo, il compilatore può assumere restituisce int
.
Non credo che queste domande veramente risolvere il problema come ho avuto questo problema. La vera risposta a mio avviso è la distinzione tra prototipo e bsearch prototipo lfind. Diamo un'occhiata takea
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 *));
Se si noterà che il terzo parametro della funzione lfind è un puntatore a un tipo size_t non (come nella funzione bsearch) un valore diretto copiato.
Basta fare in modo che si passa l'indirizzo della dimensione e andrà tutto bene.