我一直在研究一个应用程序,因为图像表现得很奇怪我决定打开Wall标志,看看是否有任何奇怪的事情发生。它揭示了一个新的警告:
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 :(得分:2)
警告发生是因为你有可能“dy”为零:
int dy = y2 - y1;
'dy'用于划分:
float m = static_cast<float>(dx / dy);
如果'y2'和'y1'具有相同的值,那么它与执行此操作相同:
float m = static_cast<float>(dx / 0);
很难知道如何正确修复,因为我们没有完整的算法,但至少:在使用它作为除数之前检查dy。例如(快速肮脏的例子):
float m = static_cast<float>(dy ? dx/dy : 0); // 0 depends on your algorithm...
或者你可以将这些线夹在一起,解释y1&amp; y2等于一个无法绘制的无限小线,在这种情况下,如果dx或dy等于0,则会立即退出DrawLine函数。
答案 1 :(得分:-2)
应避免除以零。如果你有警告,你应该使用一些警卫并处理这个特殊情况(抛出异常,在你的代码流ecc中处理它作为特殊情况)。