0

C に組み込みの qsort 関数を使用して構造体をソートしようとしています

typedef struct abc{
  long long int fir;
  long long int sec;
}abc;

比較関数では、変数「fir」が構造体 abc の配列内の任意の 2 つの要素間で同じである場合、ソート条件が変数「sec」に依存するように、以下のコードを使用しました。

long long int cmp(const abc*  e1, const abc* e2)
{
if(e1->fir==e2->fir)
       return e1->sec-e2->sec;
else
    return e1->fir-e2->fir;
} 

コードが正しく動作していないようです。それを行う正しい方法は何ですか?

4

2 に答える 2

2
long long int cmp(const abc*  e1, const abc* e2)

には qsort 比較関数の正しい署名がないため、プログラムの動作は未定義です。コンパイラの警告フラグを高く設定する必要があります。これにより、そのようなことが警告されます。

減算がオーバーフローしない限り、実際のテストは問題ありません。これはおそらく長い間問題にはなりません。編集cmpの戻り値が でなければならないため、ここでは減算はうまくいきませんint。減算の結果。long long値が大きい場合、結果が大きすぎて に収まらず、間違った順序が生成されるintことqsortは確実です。

ただし、より一般的には、これはより正確です。

int cmp(const void* v1, const void* v2)
{
    const struct abc* p1 = v1;
    const struct abc* p2 = v2;

    if (p1->fir < p2->fir)
        return -1;
    else if (p1->fir > p2->fir)
        return 1;
    else
        return p1->sec < p2->sec? -1 : p1->sec > p2->sec? 1 : 0;       
}
于 2013-04-07T20:13:39.697 に答える
0

使用している組み込みの qsort は、C++ の通常の用語である「より低い」(operator<) 述語を想定している可能性があります。そして、引数が等しくない限り、どちらの場合も true を返します。

真の IFF (if and only if) を返す必要がありますe1<e2

于 2013-04-07T20:05:05.670 に答える