2011-06-05 82 views
2

問題解決 - 種。從來沒有真正的問題。看來調試器在騙我。謝謝[/編輯]operator + = yield 0

我有一個奇怪的問題,我一直無法解決迄今。我有一個私有類成員

private: 
float *_histVals; 

這是在構造函數如下初始化:

// allocate memory for the histogram bins 
size_t hSize = binsPerChan*binsPerChan*binsPerChan; 
this->_histVals = new float[ hSize ]; 
for (size_t i = 0; i < hSize; ++i) 
    this->_histVals[i] = 0.0f; 

在我想補充一點,以一定的數組元素通過以下方式以後的程序:

this->_histVals[ hIndex ] += imgFrac; 

這裏,imgFrac是大小爲1.0 * e-5的浮點值,並且_histVals[ hIndex ]元素的當前值爲零。但是調試器顯示在執行該行後,該值仍然爲零。

我懷疑浮點精度的問題,但當我嘗試與本地浮點變量相同的東西,它完美的作品。所以它必須與數組本身有關。但我不知道這可能是什麼。我也檢查了數組範圍內的索引。

任何可能導致問題的建議? 謝謝

+2

您是否嘗試打印該值?沒有人是完美的,即使調試者不是。 – 2011-06-05 19:06:28

+1

您是否正在編譯器優化啓用?你在'+ ='之後試過'printf'這個'this - > _ histVals [hIndex]'的值嗎? – 2011-06-05 19:07:16

+0

如果你正在使用指針並且有bug,那麼你的程序的所有部分都會出現奇怪的行爲。您能否向我們展示兩個完整的程序,一個顯示錯誤,另一個顯示正確的行爲?兩者應儘可能簡單。在製作這些例子的過程中,你可能會發現什麼是錯的。 – 2011-06-05 19:10:37

回答

4

使用std::vector<float>除非你想要一個艱難的生活,或者你正在學習人們如何生活在壞的舊時代。

對此具有該陣列元件不影響:

this->_histVals[ hIndex ] += imgFrac; 

可能的原因:

  • 調試器是騙你。
  • imgFrac爲零

您是否嘗試登錄涉案std::cout的所有值?也說服自己沒有參與其中,試着將它分解成魔:

float newValue = this->_histVals[ hIndex ] + imgFrac; 
this->_histVals[ hIndex ] = newValue; 

,並記錄newValue

+0

我的理解是更喜歡'double'到'float',所以'OP'使用'std :: vector '。 – 2011-06-05 19:18:53

+0

取決於所需精度級別與需要存儲的數據量。 「長雙」可能比「雙」更精確,但會因此需要更多存儲空間。 (儘管該標準允許所有這些尺寸和精度相同)。 – 2011-06-05 19:23:15