0

我现在只用 C++/CLI 和 C++ 开发了几个月,但在我看来,编程语言在这个问题上应该无关紧要。

在下面的代码行中,double k = (yEnd - yStart) / (xEnd - xStart);似乎没有执行。

//double k = 1.0;
if (xEnd - xStart == 0)
{
    selected = true;
    return true;
}

// Checks if Y-coordinate corresponds to X-coordinate
else 
{
    // Calculating the slope of the line
    double k = (yEnd - yStart) / (xEnd - xStart);

    if (fabs(y - (yStart + k * (x - xStart))) < (double)selectionTolerance)
    {
        selected = true;
        return true;
    }
}

我尝试使用 F11 逐行调试它并且还设置了断点,尽管这些断点在从所述行运行调试器时移动到if (fabs(y - (yStart + k * (x - xStart))) < (double)selectionTolerance)它之后。

我已经检查了 Visual Studio 的选项以不跳过属性/操作,但它也没有帮助。当调试器在 if 处停止程序时,我看不到 的任何值k,但可以毫无问题地看到所有其他值(除了 char selectionTolerance 和 bool selected,它们都是 double 的)。

感谢您的帮助,我在网上和 stackoverflow 上搜索了很长时间,但找不到像这样简单(并且可能是一般性)的行的问题。

更新:

感谢 David Yaw 和 GK,我能够看到 k 的值。我仍然对这里说明的一个问题感到困惑:http: //i.imgur.com/MyVGTwJ.png(还不能发布图片)

即使yEnd, yStart, xEnd,xStart都是类型double并且具有如上图所示的值,但当程序在执行之前在第 254 行停止时k=ydif/xdif;k等于0.0000000000000000。我添加了三行

双 ydif= (yEnd-YStart);
双xdif=xEnd-xStart;
k=ydif/xdif;

看看 ifk会根据需要计算,但在再次按 F11 后它得到相同的值(程序在第 256 行停止)。

我在这里发现了一个与跳跃断点问题有关的问题:Visual Studio breakpoints beingmoved

计算k我尝试的方式有什么问题,正确的方法是什么?

4

2 回答 2

1

您没有提到计算不正确,只是代码行没有受到影响。我假设计算是正确的。

局部变量可能已被编译器优化。由于您只k在一个地方使用,它消除了局部变量,并在if语句中内联计算斜率。

我已经看到 C++/CLI 编译器对方法调用做了类似的事情:我遇到了堆栈跟踪列出了我不调用的方法的异常:我调用的方法是内联的,堆栈跟踪指向的方法它叫。

于 2013-04-05T18:39:40.803 回答
0

我正在使用 Visual Studio 10.0 C++ 编译器。调试配置在调试时使用以下命令行开关 /Gm /Od /RTCs /Zi /LDd 抱歉,我不记得每个开关的作用。您可以在 CLI 中运行编译器并获取所有命令行开关的功能列表。这些基本上是所有优化的转变。

于 2013-04-07T11:23:14.457 回答