Как интерпретировать адреса в ядре ой

Вам нужна функция компаратора структуры, которая соответствует прототипу функции, ожидаемой в 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 без знака (разность двух целых без знака никогда не является отрицательной) и подвержена переполнению, если целые числа и большие величины и противоположные знаки.

16
задан Hans Then 13 May 2014 в 15:59
поделиться