У меня есть вопрос, касающийся qsort.
Это немного странно, но моя функция qsort не дает правильного вывода.Странно то, что некоторые из моих функций сравнения идентичны моим прошлым проектам, но они не дают мне правильного ввода вообще.Я не уверен, как это проверить.
Например:
int comp_name_asc(const void *a, const void *b)
{
const Rec *prec1 = (const Rec *) a;
const Rec *prec2 = (const Rec *) b;
return strcmp(prec1->name, prec2->name);
}
int comp_name_desc(const void *a, const void *b)
{
const Rec *prec1 = (const Rec *) a;
const Rec *prec2 = (const Rec *) b;
return strcmp(prec2->name, prec1->name);
}
Вторая функция должна быть в порядке убывания, но результат идентичен: она всегда в порядке возрастания.Я проверил, чтобы убедиться, что правильная функция введена в нужное время.Rec - это typedef для структуры, которую я создал, которая имеет параметр char * name.
Также (ИЗМЕНЕНО, чтобы избежать переполнения):
int comp_size_asc(const void *a, const void *b)
{
const Rec *prec1 = (const Rec *) a;
const Rec *prec2 = (const Rec *) b;
if (prec1->byteSize > prec2->byteSize)
return 1;
else if (prec1->byteSize < prec2->byteSize)
return -1;
else
return 0;
}
Результат совершенно странный, не восходящий илипо убыванию (то есть: 500, 515, 100, 200 ...).byteSize имеет тип off_t, полученный путем выполнения:
char *path; // Build the path
struct stat sb;
if (lstat(path, &sb) == 0) {
// Read sb.st_size
Я действительно не уверен, как отладить это.Все, что я знаю, это то, что введена соответствующая функция сравнения, и что некоторые похожие функции сравнения использовались для работы в прошлом.
Любые идеи или способы отладки этого приветствуются.Спасибо.
РЕДАКТИРОВАТЬ:
Добавление вызова qsort:
int index = 0;
Rec **array = (Rec **) malloc(sizeof(Rec *) * capacity);
// Adds element to the array...
qsort(array, index, sizeof(Rec *), comp_name_desc);
(Каждый раз, когда элемент добавляется в массив, индекс увеличивается.)
Спасибо.
РЕДАКТИРОВАТЬ:
Решение было дано ниже.Спасибо!
Мне пришлось изменить:
const Rec *prec1 = (const Rec *) a;
на
const Rec *prec1 = *(const Rec **) a;
из-за того, как я определил свой массив.Спасибо!