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!!!
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!!!
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
No MP tecnici (non rispondo nemmeno!), usa il forum.
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:
dove la funzione compare è:codice:qsort(vettore_parole, parole_inserite, sizeof(TIPO), (cmp)compare);
e il puntatore è:codice: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 }
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:codice:typedef int (*cmp)(const void*, const void*);
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
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.Originariamente inviato da quagmire
perche la qsort vuole un puntatore a funzione come 4° parametro?
Perche' il prototipo della qsort si aspetta dei parametri void * proprio perche' gli argomenti sono di tipo generico.perche devo definire il puntatore a funzione con const void* come argomenti invece che con il tipo "TIPO" definito da me?
Proprio perche' la funzione che usi ha dei parametri tipizzati e non void * come se li aspetta la qsortperche devo fare il cast con (cmp) per la compare quando chiamo la qsort?
No MP tecnici (non rispondo nemmeno!), usa il forum.
ok ma allora se devo fornire la funzione non basterebbe passargli la funzione come quarto parametro invece che il puntatore alla funzione?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.
Cosa significa per teOriginariamente 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?
??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.
No MP tecnici (non rispondo nemmeno!), usa il forum.
No perchè la qsort stessa deve richiamare la funzione (anche diverse volte) e quindi deve sapere il suo indirizzo
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?
Giusto.
No MP tecnici (non rispondo nemmeno!), usa il forum.
Esatto .... Come potevi fare anche:
E richiamare la qsort così:codice: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 }
codice:qsort(vettore_parole, parole_inserite, sizeof(TIPO), compare);