0

qsortを使用してdouble値の配列をソートしようとしましたが、機能しないようです。ここで何がうまくいかなかったのだろうか?

#include <stdio.h>
#include <stdlib.h>
static double compare (const void * a, const void * b)
{
  if (*(double*)a > *(double*)b) return 1;
  else if (*(double*)a < *(double*)b) return -1;
  else return 0;  
}

int main() {

    int idx;
    double* sum_least_square_err;

    sum_least_square_err = (double*) malloc (2500*2500*sizeof(double));

    sum_least_square_err[0] = 0.642;    
    sum_least_square_err[1] = 0.236;
    sum_least_square_err[2] = 0.946;
    idx = 3;

    qsort(sum_least_square_err, idx, sizeof(sum_least_square_err), compare);

    int i;
    for (i=0; i<idx; i++){
       fprintf(stderr,"sum_least_square_err[%d] = %.3f\n", i, sum_least_square_err[i]);            
    }
    fprintf(stderr,"MAEE = %.3f\n", sum_least_square_err[idx/2]);

    free(sum_least_square_err);
}

結果:

sum_least_square_err [0] = 0.642

sum_least_square_err [1] = 0.236

sum_least_square_err [2] = 0.946

MAEE = 0.236

4

2 に答える 2

9

変化する:

static double compare (const void * a, const void * b)

に:

static int compare (const void * a, const void * b)

と変更:

qsort(sum_least_square_err, idx, sizeof(sum_least_square_err), compare);

に:

qsort(sum_least_square_err, idx, sizeof(sum_least_square_err[0]), compare);

注:最初のバグについて適切なコンパイラ警告が表示されているはずです-コンパイル中ですか、gcc -Wallそれとも同等ですか?もしそうなら、コンパイラ警告に注意していますか?(そうでない場合は、ヒントを参考にして、将来、コンパイラーにこのような問題をキャッチさせてください。)

于 2012-08-13T09:34:22.933 に答える
3

私はあなたのエラーが次の行にあると信じています:

qsort(sum_least_square_err, idx, sizeof(sum_least_square_err), compare);

問題は、3番目のパラメーターがsizeof(double)、つまり配列の要素のサイズである必要があることです。代わりに、要素のサイズとは異なる可能性がある(通常は異なる)ポインターのサイズを渡していました。

詳細については、http ://www.cplusplus.com/reference/clibrary/cstdlib/qsort/を参照してください。

編集:そしてポールRは彼の答えに正しいです:あなたの比較関数のプロトタイプは間違っています。プロトタイプは次のようになります。

int ( * comparator ) ( const void *, const void * )

最後になりましたが、コードでは次のようになります。

if (*(double*)a > *(double*)b) return 1;
else if (*(double*)a < *(double*)b) return -1;

あなたは捨てていconstます。これはここでは重要ではありませんが、それでも、これは悪い形式です。

于 2012-08-13T09:37:02.190 に答える