2014-06-13 110 views
-2

非數值隨機誤差

我一直使用C++和快板5.0.10在過去的一年編碼在Microsoft Visual Studio 2010專業版遊戲,而且越來越向那裏ISN點問題發佈前還有很多事情要做。不過,現在當我構建遊戲的時候,我碰到了隨機錯誤。通過隨機錯誤,我的意思是有時遊戲運行沒有問題,有時它開始做我沒有寫入代碼的東西。例子包括在(0,0)處顯示整個精靈圖;不移動角色,但改變他/她所面對的方向;將角色朝一個方向移動,但以相反的方式顯示他們(想想moonwalk)。我相當確定它實際上並不是編碼的錯誤,因爲這些是我寫入代碼的一些初始函數,並且它們一直都有效。

問題

什麼能隨機誤差修改(即不是由程序/ IDE檢測)的一些原因,比如什麼我上面的編碼提到的(無論是本地C++或快板)?

+0

約一百萬件事。我們需要知道你的程序工作的方式,甚至開始猜測。我認爲這個問題在這裏太寬泛了。但可能有某種形式的未定義行爲。 – BoBTFish

+0

添加到BoBTFish的評論中,您可能錯誤地認爲問題不在您的代碼中。 _「他們一直工作」並不是對正確性的強有力測試。特別是面對[未定義行爲](https://en.wikipedia.org/wiki/Undefined_behavior)。 –

+0

我從來沒有聽說過_Undefined Behavior_,但是從wiki頁面@DrewDormann發佈,它聽起來像是分配一個變量,然後無法定義它。我確實回去檢查代碼中的例子,但我找不到任何代碼。我是否理解_Undefined Behavior_錯誤? – user3737701

回答

0

從您的評論,分配一個變量,然後未能[分配一個值]它許多可能UB情形之一正確的例子。 Here is a larger (but still incomplete) list

瞭解關於未定義行爲最重要的事情是,你不能做什麼的代碼會做任何假設。即使是相同的編譯二進制代碼。它可能工作,它可能會行事不端,它可能會崩潰。

如果您使用的是C或C++,未定義行爲將使無效,「他們一直在用」方法來測試函數的正確性。

+0

該線程中可能導致未定義行爲的建議之一是修改字符串文字。我使用+ =運算符來做到這一點,那麼錯誤可能存在嗎?這些問題最近纔開始出現,所以我正在深入研究最近的代碼。 – user3737701

+0

雖然我們正在遠離您發佈的問題,但它看起來像是在正確的軌道上。我建議您確保所有編譯器的警告已啓用並修復所有報告的警告。如果您有代碼,請發佈有關您的代碼的新的具體問題。祝你好運! –

2

聽起來像是某事觸動了它不應該記憶的東西。使用像Valgrind這樣的內存調試器運行你的程序並尋找類似的問題。

Invalid write of size 8 

任何無效寫入都會導致您正在描述的行爲。

+0

我和[Visual Leak Detector](http://vld.codeplex.com/)一起去了,但沒有發現任何無效的寫入。 12內存泄漏,但我會看看。內存泄漏應該只是減慢程序,但不會導致未定義的行爲,更正? – user3737701

+0

據我所知,VLD只檢查內存泄漏,不會識別無效寫入。如果你不能使用Valgrind在Linux上運行你的代碼,那麼你可以嘗試使用Dr. Memory(http://www.drmemory.org/),這會發現無效的寫入和其他內存問題。除非你使用內存有限的系統,否則內存泄漏不應該減慢速度。但是,他們可能會導致分配失敗,所以最好早點修復它們。 – user3736255