2015-12-09 5 views
0

Я определил массив структурСортировка массив структур

typedef struct sorting { 
    int number 
} SRT; 

SRT *mystr = NULL; 

который я позже динамически выделенных. и я хочу отсортировать его по number int;

Какую функцию я должен написать, чтобы выполнить qsort? Я написал:

qsort(mystr,array_index,sizeof(mystr),magic); 

int magic(const void *a, const void *b) { 
    int one=((const struct mystr*)a)->number; 
    int two((const struct myst*)b)->number; 

    return (one-two); 
} 

но это не сработало. Как мне это сделать? выкинули ошибки, не назвав тип.

+0

В случае, если «не работает», пожалуйста, напишите ровно _what_, который не работает. В этом случае размещение ошибок компилятора позволило бы намного легче ответить на вопрос. – Lundin

+0

Кроме того, это должно быть «один-два». – Lundin

+0

@ Lundin: это небрежное сравнение ошибочно в тонких путях. См. Мой ответ. – chqrlie

ответ

2

Вы не можете надежно сортировать массив с помощью функции, как написано:

  • Это синтаксические ошибки, некоторые из которых являются опечатки, другие указывают на путаницу между типами , теги структуры и имена переменных.

  • return (one - two); работает только на достаточно небольшие значения one и two. Он будет вызывать неопределенное поведение, если существует целочисленное арифметическое переполнение. Например, если one == INT_MAX и two == -1, значение one - two не указано языком C, а на общей платформе оно, скорее всего, вернет INT_MIN, отрицательное значение, что приведет к неправильной сортировке.

Простое решение заключается в следующем:

int sort_function(const void *a, const void *b) { 
    int one = ((const SRT*)a)->number; 
    int two = ((const SRT*)b)->number; 

    return (one > two) - (one < two); 
} 

Выражение (one > two) - (one < two) вычисляется в -1, если one меньше, чем two, 0, если они равны и 1 в противном случае. В C сравнения сравниваются с 0, если false и 1, если это правда.

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

qsort(mystr, array_count, sizeof(*mystr), sort_function); 
  • Второй аргумент это число структур в массиве, на который указывает mystr.
  • Третий аргумент - это размер одной структуры: sizeof(mystr) - размер указателя, а не размер точек.
  • Избегайте таинственных имен, таких как magic ... используйте описательные имена для типов, функций и переменных.
+0

Хорошо, это просто хорошо. ':)' –

0

две проблемы:

qsort(mystr,array_index,sizeof(mystr),magic); 

mystr является указателем на SRT, поэтому вы передаете в размер указателя на структуры, а не размер структуры:

qsort(mystr,array_index,sizeof(STR),magic); 

Тогда есть следующее:

int one=((const struct mystr*)a)->number; 
int two((const struct myst*)b)->number; 

mystr является переменной na меня, а не типа, и myst не определен нигде. Вам нужно имя типа здесь:

int one=((const SRT *)a)->number; 
int two=((const SRT *)b)->number; 
Смежные вопросы