VC6++ MFC でくんでいるのですが、
qsortで以下のエラーがでて困っています。
原因がわかりません。
このようなエラーが発生した経験のある方いましたら、ご教授下さい。
'qsort' : 4 番目の引数を 'int (const void *,const void *)' から 'int (__cdecl *)
(const void *,const void *)' に変換できません。 (新しい機能 ; ヘルプを参
照)
スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
具体的にエラーの出ているところのソース書いてください
エラーメッセージだけ書かれても何が間違っているか
指摘できません
またspは当ててますよね
サンプル
int compare( const void *arg1, const void *arg2 ); ←プロトタイプ宣言
void main( int argc, char **argv )
{
int i;
/* argv[0] はソート対象外です。 */
argv++;
argc--;
/* クイック ソートのアルゴリズムを使って、残りの引数をソートします。 */
qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );
/* ソート後のリストを表示します。 */
for( i = 0; i < argc; ++i )
printf( %s , argv[i] );
printf( \n );
}
int compare( const void *arg1, const void *arg2 )
{
/* 2つの文字列を最後まで比較します。 */
return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}
ご質問のエラーはプロトタイプ宣言が無いか
比較用関数[compare]が無い為です
または、比較用関数[compare]がqsortを使用する関数より先に宣言されていなければ
ならないためです
プロトタイプ宣言は、マイクロソフトではなくてもコンパイル可能な固有仕様に
なっていますが、ほかのコンパイルソフトは必須になっているはずです
MFCでqsortですよね。
私も同じエラーがでたことがあり、ヘルプなどを元に試行錯誤した結果、
以下のように解決できました。
「比較関数をクラスの宣言部で、
private:
static INT __cdecl Comp(const void * a, const void * b);
として、定義する箇所で、
INT __cdecl CDigitizerDlg::Comp(const void *a, const void *b)
とする。」
このときのクラスはダイアログだったかな。
ここから便乗質問です。(完全に理解できないまま使ってますので)
1.__cdeclは、この関数をOSが呼ぶという意味ですよね?
2.static は、どうして定義するときに付けないのですか?
3.もっとスマートなやり方がありますか?
>qsortで以下のエラーがでて困っています。
比較関数宣言の返値直後に __cdecl をつけてみて下さい。
比較関数の呼び出し規約が__cdecl になっていないのが原因だと思います。
>1.__cdeclは、この関数をOSが呼ぶという意味ですよね?
違います。「引数授受時にスタックを使い、引数リストの右から順番にPushする
初期化コードを生成する」という意味です。__cdeclは C Declare の略です。
>2.static は、どうして定義するときに付けないのですか?
言語仕様だからです。
>3.もっとスマートなやり方がありますか?
ありません。比較関数が特定のクラスからしか使われないのであれば、これがベストです。
すみません。もうちょっと便乗させてください。
つまり、qsort()関数とのリンケージの問題、という認識でいいのでしょうか?
>qsort()関数とのリンケージの問題、という認識でいいのでしょうか?
そうです。VC++6.0以前のMSDNでリンケージ仕様をキーワードに検索すると
説明が出てくるやつです。