除以0警告

Divide by 0 warning

本文关键字:警告 除以      更新时间:2023-10-16

我一直在开发一个应用程序,因为图像看起来很奇怪,我决定打开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

发生警告是因为"dy"可能为零:

int dy = y2 - y1;

"dy"用于除法:

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

如果"y2"answers"y1"具有相同的值,则与执行此操作相同:

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

很难知道如何正确修复,因为我们没有完整的算法,但作为最低要求:在将dy用作除数之前检查它。例如:

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

或者你可以把这条线全部剪在一起,解释y1&y2等于一条根本不应该绘制的无限小的线,在这种情况下,如果dx或dy等于0,您将立即退出DrawLine函数。

应避免被零除。如果你有警告,你应该使用一些保护措施来处理这种特殊情况(抛出异常,在代码流ecc中作为特殊情况处理)。