Attenzione in caso di utilizzo di qsort in C
Domanda
Ho scritto la mia funzione di confronto
int cmp(const int * a,const int * b)
{
if (*a==*b)
return 0;
else
if (*a < *b)
return -1;
else
return 1;
}
e io ho la mia dichiarazione
int cmp (const int * value1,const int * value2);
e sto chiamando qsort nel mio programma come
qsort(currentCases,round,sizeof(int),cmp);
quando ho compilazione ottengo il seguente messaggio di avviso
warning: passing argument 4 of ‘qsort’ from incompatible pointer type
/usr/include/stdlib.h:710: note: expected ‘__compar_fn_t’ but argument is of type ‘int
(*)(const int *, const int *)’
Il programma funziona bene quindi la mia unica preoccupazione è il motivo per cui non piace il modo in cui im usate?
Soluzione
Il cmp
funzione del prototipo deve essere
int cmp(const void* a, const void* b);
Si può lanciare nella invocazione di qsort (non raccomandato):
qsort(currentCases, round, sizeof(int), (int(*)(const void*,const void*))cmp);
o getta il vuoto-puntatori a int-puntatori in cmp (l'approccio standard):
int cmp(const void* pa, const void* pb) {
int a = *(const int*)pa;
int b = *(const int*)pb;
...
Altri suggerimenti
Secondo l'uomo, un __compar_fn_t
è definita come: typedef int(*) __compar_fn_t (const void *, const void *)
Il cmp
specifica int*
i parametri.Non così, ma è solo elencato come un avvertimento.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow