qsort неправильно сортирует структуру

Я пытаюсь отсортировать структуру, которую я создал с помощью qSort, однако, похоже, она делает то, что я ожидаю.

Это моя функция сравнения

int compare(const void *a, const void *b) {
    const INPUT *p1 = a;
    const INPUT *p2 = b;
    return ((p1->startTime) - (p2->startTime));
}

Где INPUT — это моя структура, а startTime — это int внутри нее.

Я вызываю qsort по этому

qsort(*global,fileNumber,sizeof(global)/fileNumber,compare);

Где global — это имя переменной INPUT, а fileNumber — количество записей в глобальной переменной.

Судя по заявлениям printf, которые я написал, это ничего не делает.

Я инициализировал в начале моего глобального кода, как это

INPUT *global[4];

Любые идеи о том, что я сделал неправильно?

Спасибо


person varilight    schedule 25.10.2010    source источник
comment
Каковы определения fileNumber и global? Не уверен, но похоже, что global является указателем, поэтому sizeof(global) может быть не тем, что вам нужно, и вы, вероятно, также не хотите разыменовывать его в первом параметре.   -  person torak    schedule 25.10.2010
comment
Вы имеете в виду * global в строке qsort? Или только глобально? Какой тип глобального?   -  person The Archetypal Paul    schedule 25.10.2010
comment
Принятие такой разницы в качестве возвращаемого значения вашей функции сравнения почти всегда неверно. Он уязвим для числовых ошибок переполнения.   -  person R.. GitHub STOP HELPING ICE    schedule 25.10.2010


Ответы (2)


Когда вы отправляете *global в qsort, я могу представить, что вы определили global как:

INPUT **global;

Таким образом, когда вы указываете sizeof(global)/fileNumber в качестве третьего аргумента для qsort, sizeof, вероятно, равно 4 (или 8 в 64-битных системах). Тогда этот аргумент, вероятно, равен нулю.

Следовательно, qsort ничего не делает с массивом нулевых элементов и никогда не вызывает compare.

person Didier Trosset    schedule 25.10.2010

Ваш массив global представляет собой массив указателей, а не массив структур INPUT. Итак, ваша функция сравнения должна выглядеть примерно так:

int compare(const void *a, const void *b) {
    const INPUT **p1 = a;
    const INPUT **p2 = b;
    return (((*p1)->startTime) - ((*p2)->startTime));
}

И ваш звонок qsort():

qsort(global,fileNumber,sizeof(global)/fileNumber,compare);

Конечно, все это предполагает, что вы действительно используете global как массив указателей, а не указатель на массив структур INPUT.

person Michael Burr    schedule 25.10.2010