Вам нужна функция компаратора структуры, которая соответствует прототипу функции, ожидаемой в qsort()
, а именно:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
if (p1->id < p2->id)
return -1;
else if (p1->id > p2->id)
return +1;
else
return 0;
}
Если вы когда-либо попадаете в более сложный критерий сортировки, это по-прежнему хорошо потому что вы можете добавить вторичные критерии, используя один и тот же скелет:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
if (p1->latitude < p2->latitude)
return -1;
else if (p1->latitude > p2->latitude)
return +1;
else if (p1->longitude < p2->longitude)
return -1;
else if (p1->longitude > p2->longitude)
return +1;
else
return 0;
}
Ясно, что это повторяется по так много критериев, сколько вам нужно. Если вам нужно вызвать функцию (strcmp()
?) Для сравнения значений, вызовите ее один раз, но назначьте возврат к локальной переменной и используйте это дважды:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
int rc;
if (p1->latitude < p2->latitude)
return -1;
else if (p1->latitude > p2->latitude)
return +1;
else if (p1->longitude < p2->longitude)
return -1;
else if (p1->longitude > p2->longitude)
return +1;
else if ((rc = strcmp(p1->name_dyn, p2->name_dyn)) < 0)
return -1;
else if (rc > 0)
return +1;
else
return 0;
}
Также этот шаблон работает, когда данные члены представляют собой целые числа без знака, и это позволяет избежать проблем с переполнением при сравнении целых чисел со знаком. Обратите внимание, что короткое вырезание, которое вы иногда видите, а именно:
int md_comparator(const void *v1, const void *v2) /* BAD */
{ /* BAD */
const mydata *p1 = (mydata *)v1; /* BAD */
const mydata *p2 = (mydata *)v2; /* BAD */
return(p1->id - p2->id); /* BAD */
} /* BAD */
плохо, если id
без знака (разность двух целых без знака никогда не является отрицательной) и подвержена переполнению, если целые числа и большие величины и противоположные знаки.