C++ 为什么在使用内置qsort时出现此错误

C++ 为什么在使用内置qsort时出现此错误,c++,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));

我已经写了一些代码,这是给我的错误。守则如下:

  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);
此代码导致以下错误:-

从long long int(*)(const void*,const void*)到int(*)(const void*,const void*)的无效转换初始化void qsort(void*,size\u t,size\u t,int(*)(const void*,const void*)的参数4


我做错了什么

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

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

返回a
为了符合要求,即:

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


void qsort(void*,size\u t,size\u t,int(*)(const void*,const void*))
的第四个参数是指向签名为
int(*)(const void*,const void*))的函数的指针。

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

更改

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

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

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );
比较两个元素的函数。该功能应遵循以下步骤 原型:

将函数转换为

int compare (const void * a, const void * b)
   {
     return ( *(int*)a - *(int*)b );
   }
我不能长时间这样做吗??

否,此函数的内容与标准C库标题相同
。只有函数签名被两个替换 声明。(N3337/§25.5)

为什么在获取长整数时不应返回整数。

当你做这样的事情时
a=8589934592,b=4294967296
你会知道最好将a&b申报为
内部的


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

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);
}
int比较(常量无效*a,常量无效*b)
{
长rhs=*静态施法(a),
lhs=*静态_型铸造(b);
返回(右行>左行)-(左行>右行);
}

那么我不能对long long int执行此操作吗?@Ritesh不可以,可能是因为
qsort
将使用函数的结果,并且它需要一个int。假设函数返回了一个非常大的数字,它不适合int?@Ritesh-是的,可以对
long long
执行此操作。函数的返回类型必须是
int
,但这两个参数将指向传递给
qsort
的任何类型,在本例中为
long-long
。非常糟糕的建议(OP需要
long
比较函数)@Anonymous通过将返回类型更改为int@Ritesh:-它将一直工作,直到您不执行(5764607523034234880-9007199254740992)…正如我在回复中提到的(和eq-注释中提到的),简单地更改返回类型将使程序编译,但会导致错误(即错误的结果)在运行时。正如括号中所阐明的,它不会导致运行时错误,它会导致错误的结果,因为它只会将返回值截断为int-这可能会保存符号(这是这里唯一重要的事情),也可能会更改它。@Ritesh尝试以下操作:long long a[]={0,2147483649LL};qsort(a,n,sizeof(a[0]),比较);对我来说,这会导致2147483649 0作为排序序列。@IvanVergiliev-你很幸运。一个糟糕的比较函数会使
qsort
从数组末尾跑出来,产生恶劣的后果。这不是因为数字太小,而是数字之间的距离有多远-例如,如果你比较接近LLONG\M的某个数字,它就会断开AX的值接近LLONG_MIN,因为差值将溢出。@IvanVergiliev,是的(尽管足够小的数字将确保永远不会发生这种情况)@ EQ--因为问题是C++的标签,代码需要一个强制转换来转换<代码> const空白> /COD>参数到 const长L**/COD>。所有的下注都是什么?包括正确答案。
int compare (const void * a, const void * b)
   {
     return ( *(int*)a - *(int*)b );
   }
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 compare (const void * a, const void * b)
{
  return ( *(long long*)a - *(long long*)b );
}
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);
}