c qsort sembra rimuovere ultimo valore dell'array
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.
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