C ++ / CLI似乎跳过了一行代码,调试没有显示在该行中声明和定义的变量

时间:2013-04-05 18:36:56

标签: debugging c++-cli clr

我现在只用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选择,它们都是双倍的)。

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

更新

感谢David Yaw和G K,我能够看到k的价值。我仍然对这里所说的问题感到困惑: http://i.imgur.com/MyVGTwJ.png(尚未发布图片)

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

  

double ydif =(yEnd-YStart);
  double xdif = xEnd-xStart;
  K = ydif / xdif;

查看if k是否按需要计算,但在再次按F11后它会得到相同的值(程序在第256行停止)。

我在这里找到了一个与跳跃断点问题相关的问题:Visual Studio breakpoints being moved

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

2 个答案:

答案 0 :(得分:1)

你没有提到计算错误,只是代码行没有被击中。我假设计算是正确的。

编译器可能优化了局部变量。由于您在一个点中仅使用k,因此它消除了局部变量,并在if语句中进行了内联斜率计算。

我已经看到C ++ / CLI编译器使用方法调用执行类似的操作:我有一些例外,其中堆栈跟踪列出了我不调用的方法:我调用的方法是内联的,并且堆栈跟踪指向它调用的方法。

答案 1 :(得分:0)

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