2013-12-13 101 views
3

我一直在處理一個應用程序,並且由於圖像奇怪,我決定切換Wall標誌以查看是否有奇怪的事情發生。它揭示了一個新的警告:除以0警告

character.cpp(364): warning C4723: potential divide by 0 

奇怪的是,有沒有部門打算在這點任何地方:

//Currently hp is always equal to 30 
for (int i = 0; i < hp; i++) { 
    int startXPos = i*12 + 40; 
    if (i == hp-1) { 
     gfx.DrawLine(10+startXPos,15,10+startXPos,40,245,245,245); //This line 
     //This function expects: int, int, int, int, int, int, int 
    } 
} 

現在,當我與/Ox編譯這個警告只發生 - 標誌(全面優化)。與/Od(無優化)編譯時,我沒有收到警告。

我的問題是:我應該忽略這個警告(也許壓制它)?還是應該擔心?這是什麼原因造成的?

更新:在DrawLine的功能

部分:

int dx = x2 - x1; 
int dy = y2 - y1; 

if(dy == 0 && dx == 0) { 
    //1 pixel line 
} 
else if(std::abs(dy) > std::abs(dx)) { 
    if(dy < 0) { 
     std::swap(x1,x2); 
     std::swap(y1,y2); 
    } 
    float m = static_cast<float>(dx/dy); 
    //No different/more division past this point 
+0

什麼是'gfx.DrawLine'?這是你的職能之一嗎? –

+0

@chuex是的,這將是調用DrawLine函數的圖形對象。 –

+5

只是一個瘋狂的猜測,但也許有一些內聯正在進行? 'gfx.DrawLine'裏面有什麼區別嗎? –

回答

2

該警告是因爲你有 「DY」 是零的可能性:

int dy = y2 - y1; 

而 'DY' 的鴻溝正在使用:

float m = static_cast<float>(dx/dy); 

如果 'Y 2' 和「Y1 '具有相同的價值,那麼它就像這樣做:

float m = static_cast<float>(dx/0); 

很難知道如何正確解決,因爲我們做n沒有完整的算法,但至少:在使用它作爲除數之前檢查dy。如(快速ñ骯髒的例子):

float m = static_cast<float>(dy ? dx/dy : 0);  // 0 depends on your algorithm... 

或者,您可裁剪線一起,解釋Y1 & Y2等於無限小的線,不應該在所有的繪製,在這種情況下,你會退出如果dx或dy等於0,DrawLine函數會立即生效。

-2

應避免被零除。如果你有警告,你應該使用一些警衛並處理這個特殊情況(拋出異常,在你的codeflow ecc中作爲特例處理)。