qsort с typedef структурами в C - PullRequest
       91

qsort с typedef структурами в C

0 голосов
/ 24 февраля 2020

После поиска во многих сообщениях я не могу решить свою проблему. Я хочу заказать массив структур в зависимости от одного поля (крайний срок):

typedef struct{
    int ident;
    int computation;
    int period;
    int deadline;
}task_t;
task_t *tasks;

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

        task_t *ia = *(task_t**)a;
        task_t *ib = *(task_t**)b;
        //task_t *ia = (task_t *)a;
        //task_t *ib = (task_t *)b;

        return (ia->deadline - ib->deadline);
}

//Randomly generation of parameters of tasks

fprintf(stderr,"before:\n");
    for (i=0;i<nT;i++){
            fprintf(stderr,"%d;%d;%d;%d\n", tasks[i].ident, tasks[i].computation, tasks[i].deadline,tasks[i].period);
        }

size_t size = sizeof(tasks) / sizeof(task_t*);

qsort(tasks, size, sizeof(task_t *), compare);


    fprintf(stderr,"\after:\n");
    for (i=0;i<nT;i++){
            fprintf(stderr,"%d;%d;%d;%d\n", tasks[i].ident, tasks[i].computation, tasks[i].deadline,tasks[i].period);
        }

До и после qsort результат одинаков. Я думаю, что проблема в указателе, но я не знаю, как ее решить. Я перепробовал множество комбинаций qsort (& tasks, size, sizeof (task_t *) и сравнивать); а также внутри функции сравнения, но результат не меняется. Не могли бы вы помочь мне? Извините, если вопрос так много повторяется.

1 Ответ

5 голосов
/ 24 февраля 2020
size_t size = sizeof(tasks) / sizeof(task_t*);

работает, только если tasks является массивом task_t*. Это не так, это указатель на task_t (предположительно на массив task_t, но не на массив с размером во время компиляции). Вы не можете использовать sizeof в этом случае, вы просто должны знать, насколько велик массив каким-либо другим способом. Таким образом, вы в основном просили qsort отсортировать массив с одним элементом.

Вы также неправильно написали свой компаратор; если массив имеет значение task_t s, то получаемые им void* s действительно являются указателями на task_t, а не двойными указателями на task_t. Поэтому вам нужно изменить:

    task_t *ia = *(task_t**)a;
    task_t *ib = *(task_t**)b;

на:

    const task_t *ia = a;
    const task_t *ib = b;

Наконец, вам нужно передать sizeof(task_t) в qsort, а не sizeof(task_t *); опять же массив имеет значение task_t, а не task_t*.

...