【问题标题】:Visual studio skipping code mfc C++Visual Studio 跳过代码 mfc C++
【发布时间】:2014-12-17 13:45:02
【问题描述】:

我正在尝试在按钮单击时编译一个简单的函数

std::string file_name((LPCTSTR)m_file_name);


    file_name = "D:\\test_image.bmp";

    int width = 0;
    _width_glo = 0;
    _height_glo = 0;

    Mat image_inp;
    image_inp = imread(file_name, CV_LOAD_IMAGE_COLOR);

    width = image_inp.cols;
    TRACE("trace width : %d\r\n", width);

    _width_glo = image_inp.cols;
    _height_glo = image_inp.rows;

    BYTE *inp_value_buf = change_to_BYTE(image_inp);

    if(m_data_type_selected == BMP_value)
    {
        Reverse_top_bottom(inp_value_buf);
    }

但视觉工作室正在跳过这条线

int width = 0;
width = image_inp.cols;

并且在运行时不将宽度视为变量,同时在 _width_glo 和 _height_glo 内发送垃圾值

知道为什么代码会这样吗?谢谢。

【问题讨论】:

  • 首先,“跳线”是什么意思?其次,你有没有在调试器中单步调试过代码?
  • “在运行时不考虑宽度作为变量”是什么意思? (顺便说一句:在尝试对图像执行任何操作之前,您应该检查图像是否已成功加载。)
  • 是的,图像可能已加载,并且不考虑我的意思是它甚至没有为该变量分配内存并将垃圾值放入变量中。
  • 对不起前一个..我在清除缓存后再次尝试调试它并且在调试时运行良好但是当我尝试运行发布版本时它给了我同样的问题
  • 不要尝试调试发布版本。 (你只会看到垃圾)

标签: c++ visual-studio-2010 opencv


【解决方案1】:

如果您使用发布/优化标志进行编译,很可能 TRACE 没有实现,因此 width 变量会被编译器简单地删除,因为它根本没有被使用。

_width_glo 和 _height_glo 中的垃圾值很可能是 Mat 对象 image_inp 的未初始化属性。请注意,未初始化的变量行为是未定义的,并且通常在 Debug 和 Release 之间有所不同(取决于编译器,在某些情况下,有些可能会自动将变量初始化为零,但在其他情况下则不会)。

【讨论】:

  • 谢谢。这是否意味着即使 Mat 对象有值,发布版本仍然可以为我分配值的变量显示无值或垃圾?
  • 抱歉.. 选择 Paul 的答案,因为他是第一个。再次感谢您。
  • 你应该选择最好的,而不是第一个 ;-),我的帖子回答了你在对 Paul 的评论中提出的问题......
【解决方案2】:

如果您尝试调试 Release 版本,您可能会看到当前语句箭头会向前跳跃几行,有时甚至向后跳跃。您可能还会看到不正确的变量值。这是因为通常为发布版本启用的优化。

【讨论】:

  • 谢谢。这是否意味着即使 Mat 对象有值,发布版本仍然可以为我分配值的变量显示无值或垃圾?
  • 调试器可能会显示垃圾或根本不显示值(比如没有这样的已知变量)。这并不意味着该值不正确(尽管由于代码中的错误,它可能不正确)。使用日志/控制台输出/调试器输出找出真正的值是什么。 PS:接受对你最有用的答案,不是第一个,我不是为了额外的+15 rep ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多