【问题标题】:Why would printing a variable change its value?为什么打印变量会改变它的值?
【发布时间】:2011-11-25 00:41:18
【问题描述】:

我有一个小函数,它应该基于机器学习算法进行预测。该函数不工作,所以我放了一个打印语句来检查值,突然它开始工作了。当我注释掉打印行时,它再次停止工作。关于为什么会发生这种情况,我有什么遗漏吗?

int makePrediction( const InstanceT & instance, bool biased ){
  double dotProduct = ( biased ? instance * _weights + _bias : instance * _weights ); 
  std::cout << "dotProduct = " << dotProduct << std::endl;
  return ( dotProduct > 0 ? 1 : -1 );
}

由于某种原因会产生不同的结果

int makePrediction( const InstanceT & instance, bool biased ){
  double dotProduct = ( biased ? instance * _weights + _bias : instance * _weights ); 
  return ( dotProduct > 0 ? 1 : -1 );
}

为了表明在相同输入的情况下结果不同,我将这个函数称为:

std::vector<InstanceT> _instances = populate_data() //this works for both versions
for ( int i = 0; i < _instances.size(); i++ ){
  std::cout << "prediction: " << makePrediction( _instances[i], true ) << std::endl;
}

有什么想法吗?

【问题讨论】:

  • codereview.stackexchange.com 的好问题
  • “没有工作”是什么意思?预期和观察到的行为是什么?请指定准确的输入和输出。
  • 发布出现问题的完整(但最少)代码。发布结果。解释你的期望。请参阅此 FAQ item,了解如何发帖。它不是为 SO 制作的,但它也适用于这里。
  • 您的应用程序是多线程的吗? I/O 有时可以“解决”并发问题,因为它引入了延迟(可能是因为要写入控制台的互斥锁等)。当然,问题只是隐藏起来,根本没有解决。
  • “不起作用”不是一个好的问题描述。

标签: c++ printing stdout cout


【解决方案1】:

这经常发生有两个原因:

  1. 并发问题。如果您的程序是多线程的,您可以使用调试输出来掩盖竞争条件。尝试使用 MT 调试器,例如 helgrind。
  2. 损坏的堆栈。尝试在你的程序上运行 valgrind,看看它是否干净。

当然,这些是非常通用的建议,但您必须更好地说明您的问题才能获得更好的建议:-)。

【讨论】:

  • 代码不是多线程的,所以应该不是并发问题。并回答其他一些评论者,关于发布结果:本质上,给定相同的输入(类中的参数和数据成员都相等),代码生成 +1 和 -1 并带有 print 语句,但是仅在打印语句结束时产生 -1。
  • @Max:我认为你错过了评论者的主要观点。举一个“失败”的具体例子。我可以编译的代码,它将重现问题。你有一些丑陋的错误,但如果你不努力,没有人可以帮助你。
  • 问题是,我不知道如何提供一个好的例子,因为这是一个更大的代码结构的一部分,它依赖于来自单独文件的数据集。如果不包含所有代码,我不知道如何制作一个好的示例。
  • 好吧,错误就在那个更大的代码库中。在最小化示例的过程中,您可以找到错误。这就是重点
  • 事实证明这是 const 正确性的问题,并且确实存在于原始帖子之外的代码中。我试图删除这篇文章,但我被告知必须由版主这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多