2012-06-20 37 views
4

當程序啓動時,我的程序需要將幾個浮點數設置爲默認值。隨着程序運行,這些整數將被設置爲它們的真實值。然而這些真值可以是任何實數。我的程序將一直在檢查這些數字,以查看它們的值是否已從默認值改變。例如,讓我說我有整數A,B,C。所有這些整數將在開始時設置爲默認值(可以說是-1)。然後隨着程序的進行,可以說A和B分別設置爲3和2。由於C仍然是默認值,程序可以推斷出C還沒有被分配非默認值。整數的默認值?

嘗試查找唯一的默認值時出現問題。由於數字的值可以設置爲任何值,如果它設置的值與默認值相同,我的程序將不知道一個浮點數是否仍具有默認值,或者其真值是否與默認值相同。

我認爲NULL是一個默認值,但在C++中NULL等於0,導致相同的問題!

我可以創建一個由bool和float組成的完整對象作爲成員,其中bool指示該float是否已被賦值爲自己的值。然而,這看起來像是過度殺傷力。有沒有一個默認值,我可以設置我的浮動,這樣的價值是不相同的任何其他值? (例子包括無限或我)

我要求的C/C++解決方案。

+0

C本質上不支持確定值是否已分配的能力。一種策略是創建一個散列表(從變量名到分配的值),如果散列表中不存在變量名,那麼它就沒有分配給它。 –

+0

*無限或我*不是整數。如果你正在處理浮點數,你可以使用非數字(nan),但是整數沒有這個值。你可以使用boost :: optional(實現應該類似於一個布爾值和整數的組合......或者你自己的,但是沒有*無效的*整數(除非你的域中有一個,即在你的域中)域-12345是不可能的......) –

+0

你在最後提到了float,在C++中,你可以使用Nan,std :: numeric_limits, :: NaN(),作爲標記,但是沒有用於整數的標記值 –

回答

7

我可以創建選自由布爾和整數作爲 構件,其中該布爾指示的數目是否已經被分配 其自身的價值還與否的整個對象。然而,這看起來像是過度殺傷力。

你所描述的在.NET中被稱爲「nullable type」。 A C++實現boost::optional

boost::optional<int> A; 

if (A) 
    do_something(*A); 
+1

我不認爲這回答他的問題... – NominSim

+0

@NominSim我編輯了我的答案。現在我認爲它回答了這個問題。 – kol

+0

是的,看起來不錯,+1。 – NominSim

2

沒有可以分配給不是實際int的int的位模式。如果您確實沒有超出範圍的整數值,則需要保留單獨的標誌。

1

如果有效的int域的值是無限的,唯一的選擇是管理位,指示它是否被分配。

但是,你確定MAX_INT是一個理想的選擇嗎?

1

沒有辦法保證您分配一個int的值不會等於另一個隨機int。確保你想要發生的唯一方法是創建一個單獨的bool來說明變化。

1

不,您將不得不創建自己的數據類型,其中包含有關是否已分配的信息。

0

如果像你說的,沒有整數值是關閉的限制,那麼你就不能指定一個默認的「未初始化」的價值。就像你在你的問題中所建議的那樣,使用一個帶有int和bool的結構。

0

我可以創建選自由布爾和整數作爲 構件,其中該布爾指示的數目是否已經被分配 其自身的價值還與否的整個對象。然而,這看起來像是過度殺傷力。

我的第一個猜測是有效地使用一個標誌並標記每個變量。但這當然不是你唯一的選擇。

  1. 您可以使用指針(可以是NULL)並動態分配內存。不是很方便。
  2. 您可以選擇幾乎從不使用的自定義值。然後您可以將此值定義爲默認值。有時候,你需要將這個值賦給你的浮點數,但這種情況不會經常發生,你只需要跟蹤這些變量。鑑於這種情況的發生,應該有一個簡單的鏈表。
5

在一個二進制補碼機器上,有一個整數值比其他值小:INT_MIN。否定它,你不能產生有效的正面價值。由於它是整數範圍中最不有用的值,因此它是標記值的不錯選擇。它也有一個容易識別的十六進制值0x80000000。