【问题标题】:Adding endl fixes code添加 endl 修复代码
【发布时间】:2014-12-22 09:26:20
【问题描述】:

在我正在编写的程序中,某个代码块只有在我的开头有 cout << endl 语句时才能正常工作。如果它不存在,则程序不会出现段错误,而只是在 100% 的情况下给出可验证的错误答案。使用cout << endl 语句,它每次都有效。我实际上不知道是什么原因造成的,因为我尝试使用 cout.flush() 刷新 cout 缓冲区,但没有效果。此外,没有 endl 使用 cout 是行不通的。我还仔细检查了,Node 结构的所有成员变量都已在该结构的初始化列表中初始化。如果有人可以帮助我,我将不胜感激!这是有问题的代码:

`    bool Board::CheckDistinct(Node* node, int* rec) {
      cout << endl; // if I comment this line out, it doesn't work correctly
      if(node->incoming.size() > 1) {
        Node* rec_node = node->incoming[rand() % node->incoming.size()];
        *rec = rec_node->row * num_cols() + rec_node->col;
        return false;
      }
      else if(node->incoming.size() == 0) return true;
      else {
        node->visited = true;
        if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);
      }
    }

这是Node 结构的代码(如果有帮助的话):

   struct Node {
      int val, row, col, dist;
      bool visited, is_white_hole, is_black_hole;
      Node* outgoing[4];
      std::vector<Node*> incoming;
      Node(int val_, int row_, int col_) :
      val(val_), row(row_), col(col_), dist(-1),
      visited(false),
      is_white_hole(true), is_black_hole(true) { }
  };

【问题讨论】:

  • 你在使用图书馆吗?
  • 您的预期输出是什么,实际输出是什么?你在哪里以及如何产生所说的输出? “它给出了一个错误的答案”没有帮助。
  • 你能给出上下文,函数被调用的地方吗?
  • 预期的输出是是否存在到该节点的明显最短路径,如果我将 endl 注释掉,那么它总是发现它不是不同的。

标签: c++ endl


【解决方案1】:

我怀疑问题在于你没有返回你的内部结果:

    if(!node->incoming[0]->visited) CheckDistinct(node->incoming[0], rec);

应该是:

    if(!node->incoming[0]->visited) return CheckDistinct(node->incoming[0], rec);
                                    ^^^^^^

cout 调用可能只是以某种方式改变了代码生成(例如,编译器可能决定实际递归而不是将尾递归转换为循环,或以某种方式使用不同的寄存器,或长其他东西的清单。

(要注意这个错误我见过很多次,自己也犯过几次……一点都不稀奇!)

【讨论】:

  • 啊,我不敢相信我错过了!不幸的是,我不完全确定如何,它仍然取决于我修复后的 cout 语句。
  • 然后我将开始调试 - 在各种场景中逐步执行代码,最后打印您的输入和结果。
  • 或者,发布一些完整的代码,以便这里的人可以尝试一下。错误很可能在其他地方(您可能需要将代码分解为一个较小的测试程序,因为这里的任何人都不太可能调试一大段代码)。还启用了-Wall -Wextra -Werror(或等效的)并修复了它引发的任何警告。
  • 如果你在函数末尾到达} 而没有返回值,一个可能的后果是堆栈上的任何垃圾都将被视为返回值;这可以解释为什么函数调用 endl 会影响这一点。
  • @MattMcNabb:返回值通常在 R0、D0、EAX/RAX 或任何“主寄存器”中,而不是在堆栈中。
【解决方案2】:

好的,我终于找到了。错误出现在 return 语句中:

if(!node-&gt;incoming[0]-&gt;visited) CheckDistinct(node-&gt;incoming[0], rec);

如果这不是真的,我没有 else 语句会返回,所以我猜此时发生了未定义的行为。我仍然不知道为什么cout &lt;&lt; endl 解决了这个问题,但我想就是这样。

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多