C QSORT, кажется, удаляет последнее значение в массиве
Вопрос
Я использую встроенный QSORT, чтобы сортировать массив структуров. Но после вызова QSort последний элемент в массиве, кажется, имел свое значение, которое я сортирую, установив пустым.
Вот мой код ...
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 );
}
}
}
Я должен упомянуть, что если я прокомментирую линию, которая вызывает QSort, то все записи отображаются правильно, но когда QSort вызывается, то записи все отображаются (не отсортированы) и печатают пустое значение для заголовка для последней записи.
Решение
qsort( *entries, numEntries, sizeof(TvEntry*), &compareByName);
Неверно, вы не хотите разыскивать первый элемент вашего массива. Сделай это
qsort(entries, numEntries, sizeof(TvEntry*), &compareByName);
Кроме того, ваш SFOM Funciton получит указатели на элементы, а элементы указатели, так что это должно быть, например,
int compareByName( const void* val1, const void* val2 )
{
const TvEntry** entry1 = (TvEntry**)val1;
const TvEntry** entry2 = (TvEntry**)val2;
return strcasecmp( (*entry1)->title, (*entry2)->title );
}
Не связан с StackOverflow