3

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

  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*))'

我在这里做错了什么?

4

6 回答 6

5

qsort 需要一个返回类型为 int 的方法,而不是 long long。

而且因为直接转换为 int 可能实际上会搞砸您的比较器函数,您可能应该这样做(假设您已经将 a 和 b 转换为 long long):

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

为了符合要求,即:

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

于 2012-09-02T15:13:36.083 回答
2

的第 4 个参数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

于 2012-09-02T15:14:52.577 回答
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);
}
于 2012-09-02T15:24:16.510 回答
1

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

于 2012-09-02T15:17:36.323 回答
0

改变

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

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

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

于 2012-09-02T15:15:10.953 回答
-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; 你就会知道最好将 a & b 声明为 int。

于 2012-09-02T15:15:26.970 回答