在C中使用qsort / casting

时间:2014-02-08 05:25:01

标签: c casting qsort

我正在尝试使用qsort()对我的数组进行排序,但是会出现一个奇怪的错误......

error: passing argument 4 of ‘qsort’ from incompatible pointer type
/usr/include/stdlib.h:761: note: expected ‘__compar_fn_t’ but argument is of 
type ‘int (*)(struct Record *, struct Record *)’

这是我的函数调用:

qsort(arr, (sizeof(arr)/sizeof(struct Record)), sizeof(struct Record), compare);

这是我的比较方法:

int compare (struct Record *a, struct Record *b){

return (a->key - b->key);
}

我知道这可能是一个投射问题 - 但我想我可以直接传递比较函数的名称..?

2 个答案:

答案 0 :(得分:2)

如果您查看,则错误非常明确:__compar_fn_t类型为int(*)(const void*, const void*),但您的功能为int(*)(struct Record*, struct Record*)。 Quicksort不知道数组的类型,所以你必须使用void*作为比较器参数,然后将它们转换为其中的相应类型:

int compare (const void *a, const void *b){
    struct Record const* a_r = (struct Record const*)a,
                       * b_r = (struct Record const*)b;

    return (a_r->key - b_r->key);
}

答案 1 :(得分:1)

int compare (const void * a, const void * b)
{
  return ( *(struct Record*)a -  *(struct Record*)b );
}