qSort для сортировки структур

Я пытаюсь отсортировать следующую структуру:

typedef struct thing {
    char *text;
    int count;
} *Item;

Я создаю дополнительный вектор для сортировки структур следующим образом:

Item items[nr_of_items];

... here is a loop to place the items inside the vector items ...

qsort(items, nr_of_items, sizeof(Item), cmpItem);

А вот и функция сравнения:

int cmpItem(const void *a, const void *b) {

  const Item item_a = (const Item)a;
  const Item item_b = (const Item)b;

  /* Return 1 or -1 if members are not equal */
  if (item_a->count > item_b->count) return 1;
  if (item_a->count < item_b->count) return -1;

  /* Return 1 or -1 if members are not equal */
  if ( strcmp ( item_a->text, item_b->text ) > 0 ) return 1;
  if ( strcmp ( item_a->text, item_b->text ) < 0 ) return -1;

  /* Return 0 if both members are equal in both structures */
  return 0;

}

Вектор создается правильно, но не сортируется. Я делаю что-то неправильно? Любая помощь приветствуется.


person Diogo Redin    schedule 10.05.2016    source источник
comment
Вероятно, есть много дубликатов этого. Вам нужно const Item item_a = *(const Item *)a.   -  person Steve Summit    schedule 10.05.2016
comment
Спасибо, я пробовал это раньше, но всегда получаю ошибку ошибки сегментации. Может быть, это потому, что я определил свою структуру как *Item?   -  person Diogo Redin    schedule 10.05.2016
comment
Это должно работать, если Item задан как указатель, если все указатели в исходном массиве items настроены правильно. Действительно ли items[] содержит nr_of_items допустимых указателей на struct thing? (а как насчет выделения указателей text, вы уверены, что и с ними все в порядке?)   -  person Steve Summit    schedule 10.05.2016


Ответы (1)


Функция обратного вызова compar для qsort получает два аргумента, которые указывают на сравниваемые объекты, то есть указатели на два элемента в массиве items. Это означает, что и a, и b являются указателями на Item, а не на сам Item. Вам нужно изменить это:

const Item *pa = a;
const Item *pb = b;
const Item item_a = *pa;
const Item item_b = *pb;
person fluter    schedule 10.05.2016