Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    64

    [C] funzione di libreria qsort

    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!!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    64
    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:
    codice:
    qsort(vettore_parole, parole_inserite, sizeof(TIPO), (cmp)compare);
    dove la funzione compare è:

    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
    }
    e il puntatore è:
    codice:
    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

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    64
    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?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    No perchè la qsort stessa deve richiamare la funzione (anche diverse volte) e quindi deve sapere il suo indirizzo

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    64
    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?

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Giusto.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Esatto .... Come potevi fare anche:
    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
    }
    E richiamare la qsort così:
    codice:
    qsort(vettore_parole, parole_inserite, sizeof(TIPO), compare);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.