Domanda

Sto usando il costruito nel qsort per ordinare un array di strutture. Ma dopo la chiamata a qsort l'ultimo elemento della matrice sembra aver avuto il suo valore che io sono l'ordinamento per set a vuoto.

Ecco il mio codice ...

int numEntries = 5;
TvEntry* entries[numEntries]; //create array

//Entries get added to the array here...

qsort( *entries, numEntries, sizeof(TvEntry*), &compareByName ); //sort

displayAll( entries, numEntries ); //display

//here is my sort method
int compareByName( const void* val1, const void* val2 )
{
    const TvEntry* entry1 = (TvEntry*)val1;
    const TvEntry* entry2 = (TvEntry*)val2;
    return strcasecmp( entry1->title, entry2->title );
}   

//here is my display method
void displayAll( TvEntry* entries[], int length )
{
    if( entries == NULL )
    {
        printf( "List is empty\n" );
    }
    else
    {
        int i = 0;
        for( i = 0; i < length; i++ )
        {
            printf( "ENTRY: %s\n", entries[i]->title );
        }
    }
}

Devo dire che se io commento la linea che chiama qsort poi tutte le voci vengono visualizzati correttamente ma quando qsort è chiamato poi le voci sono tutte visualizzate (non Classificate) e la stampa di un valore vuoto per il titolo per l'ultima voce.

È stato utile?

Soluzione

 qsort( *entries, numEntries, sizeof(TvEntry*), &compareByName);

è sbagliato, non si vuole dereference il primo elemento dell'array. Rendono

 qsort(entries, numEntries, sizeof(TvEntry*), &compareByName);

Inoltre, il vostro funciton confrontare riceverà puntatori agli elementi, e gli elementi sono puntatori, quindi dovrebbe essere per es.

int compareByName( const void* val1, const void* val2 )
{
    const TvEntry** entry1 = (TvEntry**)val1;
    const TvEntry** entry2 = (TvEntry**)val2;
    return strcasecmp( (*entry1)->title, (*entry2)->title );
}   
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top