难以理解的VC ++ 6编译错误C2664

时间:2012-02-22 10:32:12

标签: c visual-c++ c2664

我无法弄清楚如何修复编译错误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。

3 个答案:

答案 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 *'。