0

コンパイル エラー 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がなくても気にしません。

4

3 に答える 3

2

sort_by_radioIDの署名を次のように変更します。

int __cdecl sort_by_radioID(const void * one、const void * two)

const ID2IX*そして、関数の内側にキャストすることを確認してください。

(__cdeclがデフォルトの呼び出しタイプである場合は、スキップできます。それなしで試して、コンパイルされるかどうかを確認してください)

于 2012-02-22T10:39:46.087 に答える
1

署名を試してくださいsort_by_radioID ( const ID2IX * one , const ID2IX * two)

于 2012-02-22T10:39:53.340 に答える
1

比較関数の署名が間違っています(qsortは異なるタイプの関数ポインターを予期しています)。

解決策:関数を次のように変更します:int sort_by_radioID(const void * one、const void *); また、比較関数の本体でのポインターのキャストを「constID2DX*」に変更することも忘れないでください。

于 2012-02-22T10:41:47.760 に答える