Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] Funzione di libreria qsort

    Ciao a tutti.

    Sto cercando di capire come funziona la qsort.

    Ho 2 cose da chiedere:
    1)Sapete qualche link a siti che posso consultare per capire come funziona?
    2)Mi dite per favore dove sbaglio in questo codice?

    codice:
    int strcmp2(const void *s1, const void *s2)
    {
          return strcmp(*(char **)s1, *(char **)s2);
    }
    
    int main()
    {
          char m[10][10]={"pippo", "cicci", "paperino"};
    
          qsort(m, 3, sizeof(char*), strcmp2);
    
          int i;
          for(i=0; i<3; i++)
                printf("%s\n", m[i]);
    
          return 0;
    }
    Grazie
    BUONE VACANZE

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Ecco:
    codice:
    int qsort_cmp_func (const void *s1, const void *s2)
    {
        return strcmp ((char*) s1, (char*) s2);
    }
    
    
    int main (void)
    {
        char m[10][10]= { "pippo", "cicci", "paperino" };
        int i;
    
        qsort (m, 3, 10, qsort_cmp_func);
    
        for (i=0; i<3; i++)
            printf ("%s\n", m[i]);
    
        return 0;
    }
    La funzione qsort è stata sviluppata per ordinare array con l'algoritmo "quick-sort". Per come è stata implementata:
    A) Non sa a priori su quale tipo di dato dovrà operare
    B) Non sa a priori su quanti elementi dovrà operare
    C) Non sa a priori la dimensione di un singolo elemento

    Tutti questi dati infatti vengono forniti alla funzione qsort. L'unica cosa che "sa" è questa: in base all'algoritmo quick-sort dovrà chiamare ogni volta la funzione di comparazione e in base al risultato di questa comparazione, dovrà scambiare (oppure no) i 2 elementi.
    Nel caso sopra, deve quindi sapere che ogni elemento è lungo 10 byte!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Ok provo a vedere cosa succede facendo girare il codice.

    Perchè in un programma che ho trovato sul forum:
    1) nella funzione strcmp2 usa *(char **)s1?
    2) nella qsort come terzo parametro scrive sizeof(char*)?

    codice:
    int strcmp2(const void *s1, const void *s2)
    {
       return strcmp(*(char **)s1, *(char **)s2);
    }
    
    int main( int argc, char** argv )
    {
       qsort( argv+1, argc-1, sizeof(char*), strcmp2);
    	
       int i;
       for( i = 1; i < argc; i++)
          printf("%s\n", *(argv+i) );
    	
       return 0;
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da spiderontheweb
    Perchè in un programma che ho trovato sul forum:
    1) nella funzione strcmp2 usa *(char **)s1?
    2) nella qsort come terzo parametro scrive sizeof(char*)?
    Perché quasi sicuramente (non ho tempo adesso di verificarlo) l'array su cui opera è un array di puntatori a char.

    Nota che:

    char *stringhe[3] = { "uno", "due", "tre" };

    è molto diverso da:

    char stringhe[3][10] = { "uno", "due", "tre" };

    Nel primo caso ogni elemento dell'array è un puntatore (char*), quindi la qsort deve "sapere" di dover scambiare 2 puntatori (da qui il sizeof (char*)).

    Nel secondo caso ogni elemento dell'array è un vettore di 10 caratteri (la stringa ovviamente può essere terminata prima ), quindi la qsort deve scambiare tutti i 10 caratteri delle 2 stringhe comparate.

    Sono cose diverse.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2024 vBulletin Solutions, Inc. All rights reserved.