为什么在使用内置qsort时会出错

时间:2012-09-02 15:11:21

标签: c++

我写了一些代码,它给了我错误。代码如下: -

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

 long long int number; 
 long long int *ar =(long long int *)(malloc(sizeof(long long int)*number));
 //Took the values of number and  ar from and then performed the following
 qsort(ar,number,sizeof(long long int),compare);

此代码导致以下错误: -

invalid conversion from long long int (*)(const void*, const void*)' to int (*)(const void*, const void*) initializing argument 4 of void qsort(void*, size_t, size_t, int (*)(const void*, const void*))'

我在这里做错了什么?

6 个答案:

答案 0 :(得分:5)

qsort期望一个返回类型为int的方法,而不是很长。

因为直接转换为int可能实际上搞砸了你的比较器函数,你应该做这样的事情(假设你已经把a和b转换为long long):

return a < b ? -1 : (a == b ? 0 : 1);

为了符合要求,即:

  

此函数的返回值应表示elem1是否为   通过返回认为小于,等于或大于elem2,   分别为负值,零或正值。

答案 1 :(得分:2)

void qsort(void*, size_t, size_t, int (*)(const void*, const void*))'的第四个参数是指向签名为int (*)(const void*, const void*))的函数的指针。

你给它一个签名long long int (*)(const void*, const void*)的功能,它的不同之处在于它的返回类型不正确,它应该是int

答案 2 :(得分:2)

long long compare (const void * a, const void * b)
{
  return ( *(long long*)a - *(long long*)b );
}

除了与qsort不兼容之外,这种类型的比较通常只能保证使用足够小的整数(或者更一般地说,整数从不相距太远)。更喜欢这种方式:

int compare(const void *a, const void *b)
{
  long long rhs = *static_cast<const long long*>(a),
            lhs = *static_cast<const long long*>(b);
  return (rhs > lhs) - (lhs > rhs);
}

答案 3 :(得分:1)

正如其他人所说,你的函数需要返回一个int。 qsort函数不知道它排序的元素的类型,因此在其签名中指向void的指针。当左参数大于右参数时,需要返回一个正值,当它们相等时返回零,当左参数小于右参数时,需要返回负值。你不需要提供一些确切的答案。

答案 4 :(得分:0)

更改

long long int compare (const void * a, const void * b)

int compare (const void * a, const void * b)

无论数组的类型如何,此函数的返回值始终为int。

答案 5 :(得分:-1)

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
  

比较两个元素的函数。功能应遵循这一点   原型:

int comparator ( const void * elem1, const void * elem2 );

将功能转为

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

我不能长时间做这件事吗?

  

不,此功能的内容与标准C库标题相同   <stdlib.h>。只有功能签名已被两个替换   声明。(N3337 /§25.5)。

extern "C" void qsort(void* base, size_t nmemb, size_t size,
int (*compar)(const void*, const void*));
extern "C++" void qsort(void* base, size_t nmemb, size_t size,
int (*compar)(const void*, const void*));

为什么在使用long long int时不应该返回int。

  

你做这样的事情a=8589934592,b=4294967296;   你会知道最好宣布一个&amp; b为   中间体