qsort

[戻る]
bob 2002/07/19(金) 03:59:06
VC6++ MFC でくんでいるのですが、
qsortで以下のエラーがでて困っています。
原因がわかりません。
このようなエラーが発生した経験のある方いましたら、ご教授下さい。

'qsort' : 4 番目の引数を 'int (const void *,const void *)' から 'int (__cdecl *)
(const void *,const void *)' に変換できません。 (新しい機能 ; ヘルプを参
照)
        スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。

wood 2002/07/19(金) 05:44:55
具体的にエラーの出ているところのソース書いてください
エラーメッセージだけ書かれても何が間違っているか
指摘できません
またspは当ててますよね

wood 2002/07/19(金) 07:56:54
サンプル

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を使用する関数より先に宣言されていなければ
ならないためです


プロトタイプ宣言は、マイクロソフトではなくてもコンパイル可能な固有仕様に
なっていますが、ほかのコンパイルソフトは必須になっているはずです

たいちう 2002/07/19(金) 08:42:20
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.もっとスマートなやり方がありますか?

くたくた 2002/07/19(金) 10:19:15
>qsortで以下のエラーがでて困っています。
比較関数宣言の返値直後に __cdecl をつけてみて下さい。
比較関数の呼び出し規約が__cdecl になっていないのが原因だと思います。

>1.__cdeclは、この関数をOSが呼ぶという意味ですよね?
違います。「引数授受時にスタックを使い、引数リストの右から順番にPushする
初期化コードを生成する」という意味です。__cdeclは C Declare の略です。

>2.static は、どうして定義するときに付けないのですか?
言語仕様だからです。

>3.もっとスマートなやり方がありますか?
ありません。比較関数が特定のクラスからしか使われないのであれば、これがベストです。

PAI 2002/07/21(日) 02:17:00
すみません。もうちょっと便乗させてください。
つまり、qsort()関数とのリンケージの問題、という認識でいいのでしょうか?

くたくた 2002/07/22(月) 10:32:58
>qsort()関数とのリンケージの問題、という認識でいいのでしょうか?
そうです。VC++6.0以前のMSDNで"リンケージ仕様"をキーワードに検索すると
説明が出てくるやつです。

古いスレッドには追加発言できません。