PDA

Visualizza la versione completa : [C] funzione di libreria qsort


quagmire
11-02-2009, 19:26
salve a tutti!

Volevo chiedere se qualcuno per caso poteva fornirmi il codice della funzione di libreria qsort di C..

vorrei capire nel dettaglio come funziona e non sono riuscito a trovare niente su google..

grazie!!!

oregon
11-02-2009, 19:48
E' un po' troppo lunga (e complessa) per postarla ... per Visual C++ 2008 la trovi in

\Programmi\Microsoft Visual Studio 9.0\VC\crt\src\qsort.c

quagmire
11-02-2009, 20:05
va be come non detto, io non ho visual studio 9 purtroppo..

vorrei chiederti una cosa allora..

io sto facendo un progetto per l'universita che consiste in un programma in cui chiamo la qsort cosi:


qsort(vettore_parole, parole_inserite, sizeof(TIPO), (cmp)compare);


dove la funzione compare :



int compare(TIPO *a, TIPO*b)
{
//se il campo frequenza del primo elemento da confrontare minore del secondo restituisco -1
if(a->frequenza < b->frequenza)
return -1;
else if(a->frequenza > b->frequenza)
return 1;//se maggiore restituisco 1
else
return 0;//se uguale restituisco 0
}


e il puntatore :


typedef int (*cmp)(const void*, const void*);


il mio porgramma va.. pero, siccome ammetto di aver copiato l'implementazione di questa funzione da internet perche nn la conoscevo, vorrei chiedere se perfavore potevate spiegarmi queste cose che non mi sono chiare:

perche la qsort vuole un puntatore a funzione come 4 parametro?

perche devo definire il puntatore a funzione con const void* come argomenti invece che con il tipo "TIPO" definito da me?

perche devo fare il cast con (cmp) per la compare quando chiamo la qsort?

spero che possiate aiutarmi
grazie

oregon
11-02-2009, 20:26
Originariamente inviato da quagmire
perche la qsort vuole un puntatore a funzione come 4 parametro?

Perche' la qsort non sa quale tipo di dato deve trattare (stringhe, interi, tipi strutturati ...) e quindi non sa come confrontarli. Allora la funzione per poter confrontare i dati devi fornirla tu dall'esterno indicandola alla qsort.


perche devo definire il puntatore a funzione con const void* come argomenti invece che con il tipo "TIPO" definito da me?

Perche' il prototipo della qsort si aspetta dei parametri void * proprio perche' gli argomenti sono di tipo generico.


perche devo fare il cast con (cmp) per la compare quando chiamo la qsort?

Proprio perche' la funzione che usi ha dei parametri tipizzati e non void * come se li aspetta la qsort

quagmire
11-02-2009, 20:39
Perche' la qsort non sa quale tipo di dato deve trattare (stringhe, interi, tipi strutturati ...) e quindi non sa come confrontarli. Allora la funzione per poter confrontare i dati devi fornirla tu dall'esterno indicandola alla qsort.


ok ma allora se devo fornire la funzione non basterebbe passargli la funzione come quarto parametro invece che il puntatore alla funzione?

oregon
11-02-2009, 20:49
Originariamente inviato da quagmire
ok ma allora se devo fornire la funzione non basterebbe passargli la funzione come quarto parametro invece che il puntatore alla funzione?

Cosa significa per te


basterebbe passargli la funzione come quarto parametro

??

Se devi passare una funzione B ad una funzione A, l'unico modo che hai e' passare il puntatore di B ad A.

KrOW
11-02-2009, 20:50
No perch la qsort stessa deve richiamare la funzione (anche diverse volte) e quindi deve sapere il suo indirizzo

quagmire
11-02-2009, 20:59
ah ok, io pensavo che esistesse una differenza fra passare a una funzione un'altra funzione o il puntatore a un'altra funzione, pensa te.. vabe dai nn sono molto esperto cercate di capirmi... :)

stato quel cast che mi ha scombussolato..
e qundi, se ho capito bene, proprio quel cast all'interno della qsort serve per passare dai miei tipi a quelli generici che prende in ingresso la qsort e che ho definito cn il typedef.. giusto?

oregon
11-02-2009, 21:18
Giusto.

KrOW
11-02-2009, 21:20
Esatto .... Come potevi fare anche:


int compare(void* a, void* b)
{
//se il campo frequenza del primo elemento da confrontare minore del secondo restituisco -1
TIPO* aa = (TIPO*)a;
TIPO* bb = (TIPO*)b;
if(aa>frequenza < bb->frequenza)
return -1;
else if(aa->frequenza > bb->frequenza)
return 1;//se maggiore restituisco 1
else
return 0;//se uguale restituisco 0
}

E richiamare la qsort cos:


qsort(vettore_parole, parole_inserite, sizeof(TIPO), compare);

Loading