【问题标题】:Why debugger is not able to display/watch the struct into the deque?为什么调试器无法在双端队列中显示/观察结构?
【发布时间】:2014-04-03 08:33:44
【问题描述】:

当我调试下面的一小段代码时,Visual Studio 调试器不显示我推入 dequestruct 的值,它只显示 所有字段名称 = ???强>。所有其他 var 都被正确观看了!

有人已经有同样的问题了吗?

typedef struct ToTestDrift{
    int num;
    uint64_t pts;
    ToTestDrift(int n, uint64_t ts): num(n), pts(ts) {}
    ToTestDrift(const ToTestDrift& ro):num(ro.num), pts(ro.pts) {}
} drift_t;

ifstream input("test.txt"); 
std::deque<drift_t> drift; 
while(!input.eof())
{
    int framenum;  uint64_t pts;
    input >> pts >> framenum;  
    push_back(drift)(framenum, pts);
}

注意:我使用升压范围适配器来 push_back,但与 drift.push_back 相同!

如果我在下面的代码中提取一个值,在这种情况下,watchon t 是可以的...

  BOOST_FOREACH(frame_info_t t, tocheck)
  {
    if(t.pts != 0)
    { 
      fprintf(stdout, "%d \t %0.2f \t %0.e2f \t %d \t %d \n", t.framenum, t.pts, t.drift, t.period, t.type);
    }
  }//*/

【问题讨论】:

  • 个人建议:始终初始化所有变量。
  • 可能不相关,但您知道while (!input.eof()) 可能不会像您预期的那样工作吗?原因是 eofbit 标志直到 您尝试从文件之外读取时才设置。相反,请记住输入运算符 &gt;&gt; 返回流,并且流可以用作条件,因此您可以执行例如while (input &gt;&gt; pts &gt;&gt; framenum).
  • 什么版本的 Visual Studio?它在 2012 年和 2013 年对我来说效果很好。您正在调试调试版本而不是发布版本,对吗?
  • @RetiredNinja 嗨,我还在老年 :) 使用 Visual Studio 2008!是的,我处于调试模式...我和我的团队使用相同的模板项目,每个 vs 项目具有相同的调试设置。
  • 我刚刚添加了一些细节和快照

标签: c++ visual-studio visual-studio-debugging


【解决方案1】:

我终于找到了这个奇怪问题背后的原因。

我提供的代码不符合 C++98 标准,不应该编译(实际上它不能使用 GCC 编译)。原因是我们不能使用函数的局部变量、结构/类定义、模板(容器或其他...)read that post for more info

事实上,在可视化编译器中接受该代码,因为结构/类及其字段没有 ID,调试器“有点丢失”......

我将结构/类定义移到我的函数之外,现在编译器为结构/类创建一个 ID,调试器照常工作。

所以不是

int function() 
{
    typedef struct ToTestDrift{
        int num;
        uint64_t pts;
        ToTestDrift(int n, uint64_t ts): num(n), pts(ts) {}
        ToTestDrift(const ToTestDrift& ro):num(ro.num), pts(ro.pts) {}
    } drift_t;

    ifstream input("test.txt"); 
    std::deque<drift_t> drift; 
    while(!input.eof())
    {
        int framenum;  uint64_t pts;
        input >> pts >> framenum;  
        push_back(drift)(framenum, pts);
    }
}

typedef struct ToTestDrift{
            int num;
            uint64_t pts;
            ToTestDrift(int n, uint64_t ts): num(n), pts(ts) {}
            ToTestDrift(const ToTestDrift& ro):num(ro.num), pts(ro.pts) {}
        } drift_t;

    int function() 
    {
        ifstream input("test.txt"); 
        std::deque<drift_t> drift; 
        while(!input.eof())
        {
            int framenum;  uint64_t pts;
            input >> pts >> framenum;  
            push_back(drift)(framenum, pts);
        }
    }

注意该代码的第一个版本与新的 C++11 兼容,所有新编译器都放宽了该限制,因此结构/类的本地函数定义应该可以在 Visual Studio 中正常工作2013.

【讨论】:

  • 啊,从问题看不清楚它是一个局部结构。
猜你喜欢
  • 2020-04-19
  • 1970-01-01
  • 2012-01-27
  • 2018-05-18
  • 1970-01-01
  • 2015-04-26
  • 2020-10-15
  • 2012-11-05
  • 1970-01-01
相关资源
最近更新 更多