2016-08-30 1 views
-1

私はCでHashMapを作成していますが、すべてのHashMapsに標準であるValues()関数を作成しようとしています。C - HashMap Values()関数 - NULL値を返しますか?

for example

のは、私のHashMapのは、次のように見えたとしましょう:

(キーセットはタイプ<void*, void*>であることに注意してください)

// CAPACITY = 8, SIZE = 4 
[0] <"Pancakes", 24> 
[1] = NULL 
[2] = <"Waffles", 7> 
[3] = NULL 
[4] = NULL 
[5] = NULL 
[6] = <"Eggs", 12> 
[7] = <"Bacon", 99> 

通常、このsitatuionで、私は配列を作成しますsize_t5であり、次のようになります。

{ 24, 7, 12, 99, NULL } 

NULLはここになければなりません。そうでなければ、配列を返すと、ループを終了しようとするループはいつ停止するかを知ることができません。

もし私が次のことをしていたらどうしますか?

// CAPACITY = 8, SIZE = 4 
[0] <"Pancakes", 24> 
[1] = NULL 
[2] = <"Waffles", NULL> 
[3] = NULL 
[4] = NULL 
[5] = NULL 
[6] = <"Eggs", 12> 
[7] = <"Bacon", 99> 

突然、私の配列は、以下のようになります。

{ 24, NULL, 12, 99, NULL } 

そして、それが返された後、私はそれをプリントアウトしようとするとき、それは次のように印刷します:

24 

この問題はどのように処理すればよいですか?私はちょうどNULLの値を無視すべきですか?その場合、私のHashMapsizeが4であり、プログラマはValues()の機能から4の値を期待していますが、彼にはサイズ3の配列しか与えません。そして、いや、私は本当にあなたが離れてstructを返すから、発信者に対して異なるサイズの配列を返すための複数のオプションを持っているバックなどsizeなど複数の変数を渡すためANDアレイ

+0

質問が不明です。 '<" Waffles "、NULL>'これは有効なCコードではないので、あなたがそこで表現しようとしているものが明確ではありません。 「NULL」は何を表していますか?そして、あなたが参照し続けるためにあると思われる配列は何ですか?あなたのHashMap実装の考え方が本当に明確ではありません。おそらく、[mcve]は物事を明らかにするでしょう。 – kaylum

+1

これは、値を順番にリストしているという意味でハッシュマップのようには思えません。ハッシュマップは必ずしもそのようにはなりません。値がテーブル内の連続するスロットにあると想定することはできません。 – templatetypedef

+0

私にはっきりさせてください。上記のコードは有効なCコードではありません。私は無関係のコードで物事を複雑にしたくなかった。代わりに私は理論的な問題を記述したかったのです。 <"Bacon", 99>は2つの 'void *'フィールドを持つ 'struct Node'です。つまり、私の 'key'または' value'は 'HashMap'では受け入れられる' HashTable'ではなく 'NULL'になります。うまくいけば、それはすべての懸念をクリアする。 – Hatefiend

答えて

0

この問題を解決するには、KeysまたはValuesの代わりに<Key, Value> Nodesを返すだけです。私のプログラムでは、NULLNodesを扱う必要がないので、NULLKeysValuesの問題を完全に回避します。私が提案された方法の一つに行かなければならない場合、私はKaylumの提案を使用します。

ありがとうございます。

0

structをしたくありません:

  • は、発信者があなたにアレイと最大サイズを渡し、size_tを返す持っている - このオプションは、静的に行うことができる配列を、割り当てるために、呼び出し元が必要です。
  • 戻り配列へのポインタを渡して、サイズを返す - これは、呼び出し元が関数から返された配列の割り当てを解除する必要があります。
  • NULL -terminated arrayを返すこともできます。この方法でも、呼び出し元は結果を解放する必要がありますが、サイズを返す必要はありません。

データ内NULL秒戻って、それらをスキップして、発信者に指示、見返りにあなたに何を与えるものではありません非常に紛らわしい選択肢がある:あなたはまだ返された配列がどのように大きな、発信者に伝えるために必要とされています、およびNULL -terminationオプションがありません。

+0

男私は本当に 'HashMap'のほかにこの関数のためのパラメータを持っていないと思っていました。私は本当にそれをすべて持っていないと思いますか?明らかにメソッド番号2は正しく機能しませんが? – Hatefiend

+0

@Hatefiendは 'NULL 'で終了する配列を返して、パラメータを持たない関数を持つことができます。 – dasblinkenlight

0

1つのオプションは、値セットの一部ではないセンチネル値を使用することです。例えば、代わりNULLの、(任意の型の)ダミー変数を宣言し、センチネル値とそのアドレスを使用する:あろう

int dummy; 
void *sentinel = &dummy; 

とサンプル値の配列:sentinel

{ 24, NULL, 12, 99, sentinel } 

HashMap実装によってエクスポートされたAPIの一部であり、クライアントコードはその値をチェックして値配列の終わりを判断します。

+0

私は、「センチネル」を使用しなければならないハッシュマップを使用するプログラマをかなり大きな犠牲にするような気がします。 'Values()'を返すときに他の言語にもNULL値が含まれていますか? – Hatefiend

+0

どのように巨大な犠牲ですか? 'NULL 'は配列の終わりを示し、' sentinel'であることをユーザに伝える代わりに、標準的なファイル関数のように、特別な 'EOF'値を使用します。あなたが好きではない場合、あなたの他の選択肢は明示的なサイズを渡すことです(あなたも好きではないように思えます)。あなたが受け入れるか受け入れられないと考えるかを述べないと、あなたの質問に答えることが難しくなります。しかし、これらの2つの主要なオプション - サイズまたはセンチネルです。 – kaylum

+0

@Hatefiend私は値の配列の最初の要素としてサイズを持つ別の方法があると思います。私の意見では他の選択肢ほどきれいではありませんが、うまくいくでしょう。 – kaylum

関連する問題