Domanda

Sono uno studente e ho guardato questa funzione in un libro. Esso funziona come dovrebbe, ma io non capisco il funzionamento interno del sortFunction() che viene passato alla funzione qsort(). Se qualcuno potrebbe spiegare in dettaglio, si prega di fare. Grazie in anticipo.

#include<iostream>
#include<stdlib.h>

using namespace std;

//form of sort function required by qsort()
int sortFunction(const void *intOne,const void *intTwo);

const int tableSize = 10;

int main()
{
    int i, table[tableSize];

    //fill the table with values
    for(i = 0; i < tableSize; i++)
    {
        cout << "Enter value " << (i + 1) << " : ";
        cin >> table[i];
    }
    cout << "\n";

    //sort values
    qsort((void*)table, tableSize, sizeof(table[0]), sortFunction);

    //print the results
    for(i = 0; i < tableSize; i++)
    {
        cout << "Value " << (i + 1) << " : " << table[i] << endl;
    }

    cout << "\nDone\n";

    return 0;
}

int sortFunction(const void *a, const void *b)
{
    int intOne = *((int*)a);
    int intTwo = *((int*)b);

    if (intOne < intTwo)
    {
        return -1;
    }
    if (intOne == intTwo)
    {
        return 0;
    }

    return 1;    
}
È stato utile?

Soluzione

Se si guarda alla chiamata effettiva al qsort ...

qsort((void*)table, tableSize, sizeof table[0], sortFunction); 

... vedrete che prevede:

  • un indirizzo void* e la dimensione (in byte) dell'intero array dati da ordinare, allora
  • le dimensioni di un elemento di dati di tale array, allora
  • un puntatore alla funzione di confronto "sortFunction".

Non c'è alcun argomento passato che permette qsort sapere qual è il tipo dell'elemento è - vale a dire come i singoli bit in ogni elemento di dati singolo sono usati per rappresentare un certo valore di dati - quindi non c'è modo qsort può confrontare significato due tali elementi. Quando si fornisce ...

int sortFunction(const void *a, const void *b)   
{   
    int intOne = *((int*)a);   
    int intTwo = *((int*)b);   

... e qsort lo chiama, che stai ricevendo due puntatori - sono agli indirizzi di memoria, ma quando le chiamate qsort sortFunction quei puntatori void ancora dirvi nulla circa l'elemento di dati tipo , come qsort non ha alcuna conoscenza in sé per passare insieme. Le ultime due righe di codice di cui sopra sono dove - il programmatore coordinare la chiamata qsort - riapplicare le conoscenze che hai avuto tutto il tempo di ciò che il tipo di elemento di dati è: in questo caso, sono ints, in modo da lanciare ogni void* a un int* (utilizzando (int*)a), quindi dereference che int* per ottenere l'int a indirizzo di memoria a. Similmente per b. In tal modo, aver recuperato i due numeri che erano lì come numeri . Poi, il lavoro di sortFunction è quello di indicare come devono essere ordinati durante l'ordinamento finiture. Per indicare che a dovrebbe essere il primo, sortFunction può restituire un valore negativo (ad esempio -1); se sono equivalenti, return 0;, e se b dovrebbe essere il primo, restituisce alcun valore positivo (ad esempio 1). qsort() riceve le informazioni e l'utilizza per capire come mischiare gli elementi dei dati in giro come si ordina.

FWIW, C ti permette di esprimere che un po 'più succinto ...

return intOne < intTwo ? -1 :
       intOne == intTwo ? 0 :
       1;

... o (più veloce, ma basandosi su risultati del confronto booleani essere 0 e 1, che può confondere alcuni programmatori di leggere il vostro codice) ...

return (intOne > intTwo) - (intOne < intTwo);

... o, se siete che di seguito può mai essere matematicamente meno di INT_MIN (tali valori avvolgere intorno ad un grande numero positivo impropriamente) ...

return intOne - intTwo;

Altri suggerimenti

sortFunction non è effettivamente facendo l'ordinamento, viene utilizzato come una funzione di confronto per determinare se un elemento deve precedere l'altro nella lista ordinata.

Quello che si chiama 'sortFunction' è normalmente chiamato un comparatore. Si dice fondamentalmente il codice ordinamento generico qsort() se due elementi nell'essere array ordinato risultano uguali (0), o se i primi tipi dell'argomento prima del secondo (<0) o del primo tipo argomento dopo il secondo (> 0).

Con queste informazioni, più la dimensione di ogni riga, più il numero di righe della matrice e l'inizio della matrice, la funzione qsort() può ordinare i dati correttamente.

Come si può vedere nel documentazione , la funzione qsort prende un comparatore come è ultimo parametro. Questa funzione viene utilizzata per i parametri in realtà confrontare (dicono che si dovrebbe andare per primo in un array ordinato).

vedere se questo articolo aiuta. Si parla di come vengono utilizzate le funzioni di Call back e come funzioni come qsort possono essere implementate utilizzando le funzioni di callback. http://learnwithtechies.com/index.php/component/content/article/4-c/18-callback-functions-in-c-can-be-very-handy

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top