2012-02-22 16 views
0

コンパイルエラーC2664を修正する方法がわかりません。エラーは、qsort()の呼び出しによって発生します。私はradioIDsが指す配列に格納されID2IXの配列をソートしたい:理解できないVC++ 6のコンパイルエラーC2664

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 

編集:みなさん、ありがとうございます。 Us C/ASMコーダー、私たちは気にしないでください。const。

+1

あなたは 'コンパイラは、あなたが不足している語っているconst'sを追加した場合はどうなりますか? – Mat

+1

署名 'int sort_by_radioID(const void * 1、const void * 2)'で試してください。それは '__cdecl'、あなたが明示的に機能するために' __cdecl'を使用する必要がない場合 – Naveen

+1

は、あなたにもコンバージョンをデフォルトの呼び出しチェック – Necrolis

答えて

2

変更sort_by_radioIDの署名:

のint __cdecl sort_by_radioID(のconst void *型1、constの無効* 2)

そして、あなたは、関数の内部const ID2IX*にキャストしてください。

(__cdeclは、デフォルトのコールタイプであれば、あなたはそれをスキップすることができます。それなしで試してみて、それがコンパイルする場合を参照)

1

署名sort_by_radioID (const ID2IX * one , const ID2IX * two)

1

あなたの比較関数は、(qsort関数は、異なるタイプのを期待間違った署名を持ってしてみてください関数ポインタの)。

ソリューション:にあなたの関数を変更します。 int型sort_by_radioID(のconst void *型1、CONSTのvoid *); 比較関数 の本体にあるポインタのキャストを 'const ID2DX *'に変更することも忘れないでください。

関連する問題