【发布时间】:2020-02-24 15:15:37
【问题描述】:
在搜索了很多帖子后,我无法解决我的问题。我想根据一个字段(截止日期)订购一组结构:
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 *), &compare); 还有比较功能,但结果没有改变。你可以帮帮我吗?对不起,如果这个问题重复了这么多。
【问题讨论】:
-
我认为应该是
sizeof(task_t)(没有指针) -
这是
task_t *ia = (task_t*)a;,而不是task_t *ia = *(task_t**)a;。 -
-
当您的比较只能使用 a 和 b 的类型时,为什么要使用 void* ?您对 qsort 的调用是完全错误的。 tasks 是指向要排序的多个元素的指针,您的比较应该采用 const tast_t* a, const task_t* b,内部忘记转换您的比较 a->deadline - b->deadline;
-
@רועיאבידן:根本不可能是
sizeof,因为tasks是一个指针,而不是一个数组。