调用qsort比较器

时间:2016-05-12 09:04:18

标签: c qsort

我有一个返回1,0或-1的比较器函数,声明如下:

int multiPrecisionCompare(const DIGIT_T a[], const DIGIT_T b[], int32_t length); 

其中DIGIT_Tint8_t

我想调用一个函数qsort,但是我有一个问题需要理解我需要改变的内容或如何在里面调用比较器函数。

qsort(bigArray->x, 8,30 , <-what here?????->);


    i

int multiprecisionCompare(const DIGIT_T a[], const DIGIT_T b[], int32t length) 
{
  while(length--) { // little endian
if(a[length] > b[length])
  return 1;
if(a[length] < b[length])
  return -1;
}

return 0;
}


point * bigArray = (point *)(malloc(K*sizeof(point)));
CreateListAndOrder( lots of parameters) // this fills the bigArray unsorted
/* point is a structure of X,Y,Z where each of this is DIGIT_T */
qsort((void *)bigArray, K, sizeof(point), cmp);

我想根据X坐标对它进行排序,但这是通过int32t长度解决的,它应该只比较该结构的第一个坐标

int cmp(const void *a, const void *b){
    return multiPrecisionCompare((const DIGIT_T*)a, (const DIGIT_T*)b,  DIGIT_LENGTH);
    //return multiPrecisionCompare(*(const DIGIT_T**)a, *(const DIGIT_T**)b,  DIGIT_LENGTH);
}

3 个答案:

答案 0 :(得分:2)

qsort接受指向具有以下签名的函数的指针:

int cmp(void const *, void const *)

您必须调整比较函数,以匹配此签名,而不是简单地传入函数指针。

答案 1 :(得分:1)

以下是一个例子:

int cmpfunc (const void * a, const void * b)
{
   return ( *(DIGIT_T *)a - *(DIGIT_T *)b );
}

qsort(bigArray->x, 8, 30 , cmpfunc);

答案 2 :(得分:1)

int multiPrecisionCompare(const DIGIT_T a[], const DIGIT_T b[], int32_t length);
int32_t DIGIT_LENGTH;
int cmp(const void *a, const void *b){
    return multiPrecisionCompare(((point*)a)->x, ((point*)b)->x, DIGIT_LENGTH);
}

DIGIT_LENGTH = length;
point * bigArray = (point *)malloc(K*sizeof(point));
//fills the bigArray unsorted
qsort(bigArray, K, sizeof(point), cmp);