为什么打印变量会改变其值?

5

我有一个小函数,它应该基于机器学习算法进行预测。这个函数一开始是无法工作的,因此我加入了一个打印语句来检查值,然后它突然开始正常工作了。当我注释掉这个打印语句时,它再次停止工作。我是否遗漏了一些原因导致它发生这种情况?

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;
}

有什么想法吗?

2
“wasn't working”是什么意思?预期和观察到的行为是什么?请指定确切的输入和输出。 - Péter Török
8
请贴出完整(但最小化)的代码,展示出问题。列出结果。说明你期望得到的结果。请查看此**FAQ项**以获取如何发布帖子的信息。它不是为了SO而创建的,但也适用于这里。 - Cheers and hth. - Alf
@P.T.:不是的。代码审查是用于工作代码的审核,而不是用于“为什么这段代码会产生意外/未定义行为?”这类问题的。 - sepp2k
2
你的应用程序是否支持多线程?I/O有时可以“解决”并发问题,因为它引入了延迟(可能是因为互斥锁写入控制台等)。当然,问题只是被隐藏了,根本没有得到解决。 - user948581
2
“不起作用” 不是一个好的问题描述。 - n. m.
显示剩余7条评论
1个回答

4
这种情况通常有两个原因:
  1. 并发问题。如果你的程序是多线程的,你可以通过调试输出来遮盖竞态条件。尝试使用类似helgrind的MT调试器。
  2. 堆栈损坏。尝试在你的程序上运行valgrind,并查看是否干净。
当然,这些都是相当通用的建议,但为了得到更好的建议,你需要更明确地说明你的问题 :-)。

代码不是多线程的,因此不应该是并发问题。针对其他评论者的回答,关于发布结果:基本上,给定相同的输入(参数和类中的数据成员都相等),代码在打印语句中产生+1和-1,但仅在没有打印语句时产生-1。 - Max
1
@Max:我认为你错过了评论者的主要观点。请给出一个具体的例子,说明它“失败”了。一个我可以编译并能够重现问题的代码。你有一些丑陋的错误,但如果你不付出努力,没有人能帮助你。 - Karoly Horvath
问题在于,我不知道如何提供一个好的例子,因为这是一个更大的代码结构的一部分,依赖于来自另一个文件的数据集。如果不包括所有的代码,我不知道如何提供一个好的例子。 - Max
2
好吧,问题就在那个更大的代码库中。在最小化示例的过程中,您可以找到错误。这就是整个重点。 - Karoly Horvath
结果发现这是一个常量正确性的问题,它确实存在于原始帖子之外的代码中。我试图删除这篇帖子,但被告知必须由版主来完成。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接