我无法弄清楚如何修复编译错误C2664,这让我整夜疯狂!该错误来自对qsort()的调用。我想对存储在radioIDs指向的数组中的ID2IX数组进行排序:
typedef struct id2ix { // struct maps radio id to array index
int id; // radio id
int ix;
} ID2IX;
ID2IX *RadioIDs = NULL; // radio IDs integer
.....
RadioIDs = (ID2IX*) malloc( totRadios * sizeof( ID2IX ));
if ( RadioIDs == NULL ) {
return FALSE;
}
.....
// the qsort compar function
int // sort the id2ix array by radioID
//sort_by_radioID ( ID2IX*one , ID2IX*two) { // tried this signature
sort_by_radioID ( void*one , void*two) { // tried this signature, also
return ((ID2IX*)one)->id - ((ID2IX*)two)->id;
}
// call to qsort that will not compile
qsort( RadioIDs, totRadios, sizeof(ID2IX), sort_by_radioID );
我得出的错误是:
Objects.cpp(295) : error C2664: 'qsort' : cannot convert parameter 4
from 'int (void *,void *)'
to 'int (__cdecl *)(const void *,const void *)'
None of the functions with this name in scope match the target type
我到底做错了什么?
编辑:谢谢大家。我们C / ASM编码员,我们不打扰'不要该死的 const。
答案 0 :(得分:2)
将sort_by_radioID
的签名更改为:
int __cdecl sort_by_radioID(const void * one,const void * two)
并确保你在函数内部转换为const ID2IX*
。
(如果__cdecl是默认的呼叫类型,你可以跳过它。尝试不使用它,看它是否编译)
答案 1 :(得分:1)
尝试签名sort_by_radioID ( const ID2IX * one , const ID2IX * two)
答案 2 :(得分:1)
你的比较函数有错误的签名(qsort需要不同类型的函数指针)。
解决方案:将您的功能更改为: int sort_by_radioID(const void * one,const void *); 还要记住在比较函数的主体中更改指针的转换 'const ID2DX *'。