3

エラーが発生するコードをいくつか書きました。コードは次のとおりです。

  long long int compare (const void * a, const void * b)
   {
     return ( *(long long int*)a - *(long long int*)b );
   }

 long long int number; 
 long long int *ar =(long long int *)(malloc(sizeof(long long int)*number));
 //Took the values of number and  ar from and then performed the following
 qsort(ar,number,sizeof(long long int),compare);

このコードは次のエラーになります:-

invalid conversion from long long int (*)(const void*, const void*)' to int (*)(const void*, const void*) initializing argument 4 of void qsort(void*, size_t, size_t, int (*)(const void*, const void*))'

ここで何が間違っていますか?

4

6 に答える 6

5

qsort は long long ではなく、戻り値の型が int のメソッドを想定しています。

そして、 int への単純なキャストは実際にはコンパレーター関数を台無しにする可能性があるため、おそらく次のようなことを行う必要があります (すでに a と b を long long にキャストしていると仮定します)。

return a < b ? -1 : (a == b ? 0 : 1);

要件に準拠するため、つまり:

この関数の戻り値は、elem1 が elem2 より小さい、等しい、または大きいとみなされるかどうかを、それぞれ負の値、ゼロ、または正の値で表す必要があります。

于 2012-09-02T15:13:36.083 に答える
2
long long compare (const void * a, const void * b)
{
  return ( *(long long*)a - *(long long*)b );
}

との互換性がないことに加えてqsort、このタイプの比較は、一般に、十分に小さい整数(または、より一般的には、離れすぎない整数)でのみ機能することが保証されています。代わりにこの方法をお勧めします:

int compare(const void *a, const void *b)
{
  long long rhs = *static_cast<const long long*>(a),
            lhs = *static_cast<const long long*>(b);
  return (rhs > lhs) - (lhs > rhs);
}
于 2012-09-02T15:24:16.510 に答える
2

の 4 番目の引数void qsort(void*, size_t, size_t, int (*)(const void*, const void*))'は、シグネチャが である関数へのポインタですint (*)(const void*, const void*))

あなたはそれに署名の関数を与えていますがlong long int (*)(const void*, const void*)、その戻り値の型が正しいものではないため、異なりますint

于 2012-09-02T15:14:52.577 に答える
1

他の人が言ったように、関数は int を返す必要があります。qsort 関数は、ソートする要素のタイプを認識していないため、そのシグネチャの void へのポインターです。左の引数が右の引数よりも大きい場合は正の値、等しい場合はゼロ、左の引数が右の引数より小さい場合は負の値を返す必要があります。正確な答えを提供する必要はありません。

于 2012-09-02T15:17:36.323 に答える
0

変化する

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

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

この関数の戻り値は、配列の型に関係なく常に int です。

于 2012-09-02T15:15:10.953 に答える
-1
void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

2 つの要素を比較する関数。関数は、次のプロトタイプに従います。

int comparator ( const void * elem1, const void * elem2 );

関数を

int compare (const void * a, const void * b)
   {
     return ( *(int*)a - *(int*)b );
   }

long long int に対してこれを行うことはできませんか??

いいえ、この関数は標準 C ライブラリのヘッダーと同じ内容を <stdlib.h>持っています。関数の署名のみが 2 つの宣言に置き換えられています。(N3337/ § 25.5)。

extern "C" void qsort(void* base, size_t nmemb, size_t size,
int (*compar)(const void*, const void*));
extern "C++" void qsort(void* base, size_t nmemb, size_t size,
int (*compar)(const void*, const void*));

long long int を取得しているときに int を返すべきではないのはなぜですか。

このようなことをするとすぐにa=8589934592,b=4294967296; 、a と b を int として宣言する方がよいことがわかります。

于 2012-09-02T15:15:26.970 に答える