c qsort, кажется, удаляет последнее значение в массиве - PullRequest
1 голос
/ 31 октября 2010

Я использую встроенный 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, тогда все записи отображаются (не отсортировано) и печатают пустое значение для заголовка для последней записи.

1 Ответ

10 голосов
/ 31 октября 2010
 qsort( *entries, numEntries, sizeof(TvEntry*), &compareByName);

неверно, вы не хотите разыменовывать первый элемент вашего массива. Сделай это

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

Кроме того, ваша функция сравнения будет получать указатели на элементы, а элементы являются указателями, поэтому должно быть, например,

int compareByName( const void* val1, const void* val2 )
{
    const TvEntry** entry1 = (TvEntry**)val1;
    const TvEntry** entry2 = (TvEntry**)val2;
    return strcasecmp( (*entry1)->title, (*entry2)->title );
}   
...