C QSORT, кажется, удаляет последнее значение в массиве

StackOverflow https://stackoverflow.com/questions/4062556

  •  27-09-2019
  •  | 
  •  

Вопрос

Я использую встроенный 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 );
}   
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top