在 C 中使用 typedef 结构进行 qsort
qsort with typedef structs in C
找了很多帖子,都没有解决我的问题。我想根据一个字段(截止日期)订购一组结构:
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);
并且也在比较函数内部,但结果不会改变。你可以帮帮我吗?对不起,如果这个问题重复了这么多。
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*
.
找了很多帖子,都没有解决我的问题。我想根据一个字段(截止日期)订购一组结构:
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); 并且也在比较函数内部,但结果不会改变。你可以帮帮我吗?对不起,如果这个问题重复了这么多。
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*
.