我有一个需要这样的参数的函数
void priqueue_init(priqueue_t *q, int(*comparer)(void *, void *))
我希望它能够接受任何类型的参数。
在另一个文件中我首先输入typedef
typedef int (*comp_funct)(job_t*, job_t*);
我要传递的功能......
int fcfs_funct1(job_t* a, job_t* b)
{
int temp1 = a->arrival_time;
int temp2 = b->arrival_time;
return (temp1 - temp2);
}
对priqueue_init的调用:
priqueue_init(pri_q, choose_comparator(sched_scheme));
最后,我的choose_comparator函数:
comp_funct choose_comparator(scheme_t scheme)
{
if (sched_scheme == FCFS)
return fcfs_funct1;
return NULL;
}
我在调用priqueue_init时出错。
libscheduler/libscheduler.c: In function ‘add_to_priq’:
libscheduler/libscheduler.c:125:3: error: passing argument 2 of ‘priqueue_init’ from incompatible pointer type [-Werror]
In file included from libscheduler/libscheduler.c:5:0:
libscheduler/../libpriqueue/libpriqueue.h:25:8: note: expected ‘int (*)(void *, void *)’ but argument is of type ‘comp_funct’
我在哪里挂断电话?定义priqueue_init的文件不知道job_t类型。我认为用无效参数去做是可行的。
答案 0 :(得分:3)
int (*comparer)(void *, void *)
和int (*comp_funct)(job_t*, job_t*)
不兼容。将它们更改为匹配,或添加类型转换。
指针(在您的情况下为void *
和job_t *
)不必具有相同的大小,因此编译器正确地给出了错误。由于它们在大多数机器上大小相同,因此简单的类型转换可能会解决您的问题,但您会引入一些潜在的不可移植性。
答案 1 :(得分:2)
要与函数类型签名兼容,您的比较函数必须采用void*
个参数,并在内部投射它们:
int fcfs_funct1(void* a, void* b)
{
int temp1 = ((job_t*)a)->arrival_time;
int temp2 = ((job_t*)b)->arrival_time;
return (temp1 - temp2);
}