qsort – プログラミング – Home

通知
すべてクリア

qsort


bob
 bob
(@bob)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

VC6++ MFC でくんでいるのですが、
qsortで以下のエラーがでて困っています。
原因がわかりません。
このようなエラーが発生した経験のある方いましたら、ご教授下さい。

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


引用解決済
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

サンプル

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

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


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

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.もっとスマートなやり方がありますか?


返信引用
くたくた
 くたくた
(@くたくた)
ゲスト
結合: 23年前
投稿: 119
 

>qsortで以下のエラーがでて困っています。
比較関数宣言の返値直後に __cdecl をつけてみて下さい。
比較関数の呼び出し規約が__cdecl になっていないのが原因だと思います。

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

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

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


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

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


返信引用
くたくた
 くたくた
(@くたくた)
ゲスト
結合: 23年前
投稿: 119
 

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました