2016-04-25 8 views
-1

は、だから私は、コードのこの部分を持っている:他のデータ型にはvoidを使用します。

int compare(const void *c1, const void *c2) 
{ 
    assert(c1 && c2); 
    char a = *(const char*)c1; 
    char b = *(const char*)c2; 
    if (a > b) return 1; 
    if (a < b) return -1; 
    return 0; 
} 

何それは基本的にありませんが、それは他よりも大きい任意のデータ型とチェックの二つのポインタのC1とC2を取得しています。私はこれが動作するように私は受信する任意のデータ型のためにしたいと思うが、私はダブルまたはフロートを送信しているときに問題を作るようです。
追加/変更する必要はありますか?

+1

「誰が他の人よりも大きいかどうかをチェックする」は、それが正確には何もしていない。 –

+2

[cでvoid \ *を使用して汎用関数を作成するにはどうすればよいですか?](http://stackoverflow.com/questions/13469381/how-to-make-generic-function-using-void-in-c) - そして、汚れたハックのための他の多くの要求は同様のものです。 – Olaf

+0

@SouravGhosh:悪い:実装定義です。 – Olaf

答えて

2

Cでは実行できません。Cには実行時型情報(RTTI)がありません。

c1が指すバイト数とc2が指すバイト数を比較することをお勧めします。たとえどのようなタイプのバイトが存在するのかはわかりません。だから、潜在的に無限の数の比較アルゴリズムのどれを適用するかを魔法のように決定することができる単一の「ジェネリック」関数を書く方法はありません。


補遺:それはこれを実行することが可能であった場合は、qsortを内蔵し、このような関数を使用して設計されていたであろう、そしてあなたがあなた自身の比較関数を記述する必要がありません。 qsortのデザイナーがこの責任を賭け、あなたに比較機能を書き留めるという問題を蹴ったという事実は、ユーザーにとっては、それができないことを証明しています。

qsortを呼び出すたびに、あなたは毎回あなた自身のカスタム比較関数を書く必要があるということは残念なことです。あなたは1つの汎用目的を1回書くことはできません。

+0

どのような種類のデータ型に適合するように、どうすればそのような関数を使用できますか? – LamaEu

+0

あなたが正しいです、それはqsortの一部です。 – LamaEu

+0

@LamaEu。ソート要件のデータ型を事前に知ることができないため、または昇順または降順のデータ型を事前に知ることができないため、できません。上記のように、構造体配列があり、2番目のフィールドをソートするとします。あるいは、第2フィールドが等しい場合は、第3フィールドをソートします。 –

関連する問題