0

並べ替えアルゴリズムのボイドを比較しようとしています。私はこれまでにこれを持っていますが、それらをintにキャストすると、目的のIMOをやや打ち負かします。ボイドを比較する方法はありますか?私の教授は時間を使い果たし、どのようにウェブをすくうのに行き詰まりました。どんな助けでも大歓迎です。ありがとう

int fcmp(const void *one, const void *two)
{
    if (*(int*)one > *(int*)two) return 1;
    if (*(int*)one < *(int*)two) return -1;
    return 0;
}
4

3 に答える 3

2

fcmpアイデアがのコンテキストで使用することであると仮定すると、qsortコードは完全に有効です。

qsort戻り値がまたはである1かどうかを気にせず、-1正または負の数を取るため、このバージョンはさらに短くなりますが、qsort同様に機能します。

int fcmp (const void * one, const void * two)
{
    return ( *(int*)one - *(int*)two );
}

を使用する理由qsortvoid*、異なるデータ型で同じアルゴリズムを使用できるようにするためです。

于 2012-10-24T02:43:30.063 に答える
2

このコードでは「ボイド」を比較していません。このコードは、voidポインターをポインターにキャストし、結果を逆参照します。これは、ポインターが指すsをint比較していることを意味します。int理想的には、関数は次のように記述されているはずです。

int fcmp(const int *one, const int *two)
{
    if (*one > *two) return 1;
    if (*one < *two) return -1;
    return 0;
}

fcmp()ただし、この場合は特定の署名が必要なため、そのようには記述されていません。それ以外の場合は、一般的な方法で使用できませんでした。たとえば、別の関数へのコールバックとして。

于 2012-10-24T02:45:35.637 に答える
1

これは、qsort()のようないくつかの標準ライブラリ関数で使用される標準比較関数のように見えます。この関数では、2つの要素がそれぞれに等しいかどうかを示す比較関数とともに、ある種のデータ項目の配列を使用して関数を呼び出します。そうではなく、そうでない場合は、それらの照合順序は何ですか。

したがって、voidポインターが指すのは、プログラマー次第です。比較関数を呼び出すqsort()などの関数は、2つの配列要素がどの順序になるかを知りたいだけなので、これが比較関数インターフェイスでvoidポインターを使用する目的です。配列要素は、または比較の方法であり、配列の開始アドレスと各要素のサイズ、およびそこにある要素の数を知っているだけです。

標準ライブラリのもう1つの関数は、bsearch()関数です。

したがって、これを使用するには、次のようなコードが必要になる場合があります。qsort()のマニュアルページを参照してください。

typedef struct {
   int iValue;
   char  sName[10];
} DataValue;

// compare two elements of the array and indicate which one is higher
// or lower in collating sequence or if they are equal.
int dataComp (void *one, void *two)
{
    return ((DataValue *)one)->iValue - ((DataValue *)two)->iValue;
}

int main (int argc, char *argv[])
{
    DataValue myData[25];
   //.. put some data stuff in the array.
   // call qsort with the array.  specify number of elements and size of each one
   qsort (myData, sizeof(myData)/sizeof(myData[0]), sizeof(myData[0]), dataComp);
}
于 2012-10-24T02:44:45.887 に答える