交換可能なハッシュ関数を持つハッシュテーブルを定義したいと思います。ハッシュ関数はそうのようにint型を返す、ハッシュテーブルとハッシュ化されるキーへのポインタを取る:Cの関数ポインタのtypedefの循環参照
typedef int (hash_function_t) (hashtable *, int);
ハッシュテーブル店舗のキーをハッシュするために使用される関数へのポインタ:
をtypedef struct ht {
size_t size;
...
hash_function_t *hash_function;
} hashtable;
残念ながら、これは循環参照を作成します。
ハッシュ関数の定義でハッシュテーブルへのポインタが必要なので、ハッシュテーブルのサイズに対してモジュラスを行うことができるので、最大のバケット数を超えません。ハッシュ関数を必要としないように、ハッシュ関数にハッシュ関数が必要です。
私は、このようなコードにつながる実現:少し奇妙ですが、私はそれで大丈夫だよ
*ht->hash_function (ht, key)
。
typedefをどちらの順序で並べても機能しません。ハッシュテーブルで長い定義を使用し、その後typedefを実行する必要がありますか、それとも良い方法がありますか?
これはまっすぐなC、ないC++でのすべてのものです。 ANSI Cソリューションが望ましい!
ハァ!ニースとシンプル。構造体を宣言してから再宣言できるかどうかは分かりませんでした。どうもありがとう! – majelbstoat
さあ、やって! :-)私はCを学んでリンクリストを実装したときも同じ問題を抱えていました... –