我写了一些代码,它给了我错误。代码如下: -
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*))'
我在这里做错了什么?
答案 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为 中间体