2014-06-13 60 views
-2

非数值随机误差

我一直使用C++和快板5.0.10在过去的一年编码在Microsoft Visual Studio 2010专业版游戏,而且越来越向那里ISN点问题发布前还有很多事情要做。不过,现在当我构建游戏的时候,我碰到了随机错误。通过随机错误,我的意思是有时游戏运行没有问题,有时它开始做我没有写入代码的东西。例子包括在(0,0)处显示整个精灵图;不移动角色,但改变他/她所面对的方向;将角色朝一个方向移动,但以相反的方式显示他们(想想moonwalk)。我相当确定它实际上并不是编码的错误,因为这些是我写入代码的一些初始函数,并且它们一直都有效。

问题

什么能随机误差修改(即不是由程序/ IDE检测)的一些原因,比如什么我上面的编码提到的(无论是本地C++或快板)?

+0

约一百万件事。我们需要知道你的程序工作的方式,甚至开始猜测。我认为这个问题在这里太宽泛了。但可能有某种形式的未定义行为。 – BoBTFish

+0

添加到BoBTFish的评论中,您可能错误地认为问题不在您的代码中。 _“他们一直工作”并不是对正确性的强有力测试。特别是面对[未定义行为](https://en.wikipedia.org/wiki/Undefined_behavior)。 –

+0

我从来没有听说过_Undefined Behavior_,但是从wiki页面@DrewDormann发布,它听起来像是分配一个变量,然后无法定义它。我确实回去检查代码中的例子,但我找不到任何代码。我是否理解_Undefined Behavior_错误? – user3737701

回答

0

从您的评论,分配一个变量,然后未能[分配一个值]它许多可能UB情形之一正确的例子。 Here is a larger (but still incomplete) list

了解关于未定义行为最重要的事情是,你不能做什么的代码会做任何假设。即使是相同的编译二进制代码。它可能工作,它可能会行事不端,它可能会崩溃。

如果您使用的是C或C++,未定义行为将使无效,“他们一直在用”方法来测试函数的正确性。

+0

该线程中可能导致未定义行为的建议之一是修改字符串文字。我使用+ =运算符来做到这一点,那么错误可能存在吗?这些问题最近才开始出现,所以我正在深入研究最近的代码。 – user3737701

+0

虽然我们正在远离您发布的问题,但它看起来像是在正确的轨道上。我建议您确保所有编译器的警告已启用并修复所有报告的警告。如果您有代码,请发布有关您的代码的新的具体问题。祝你好运! –

2

听起来像是某事触动了它不应该记忆的东西。使用像Valgrind这样的内存调试器运行你的程序并寻找类似的问题。

Invalid write of size 8 

任何无效写入都会导致您正在描述的行为。

+0

我和[Visual Leak Detector](http://vld.codeplex.com/)一起去了,但没有发现任何无效的写入。 12内存泄漏,但我会看看。内存泄漏应该只是减慢程序,但不会导致未定义的行为,更正? – user3737701

+0

据我所知,VLD只检查内存泄漏,不会识别无效写入。如果你不能使用Valgrind在Linux上运行你的代码,那么你可以尝试使用Dr. Memory(http://www.drmemory.org/),这会发现无效的写入和其他内存问题。除非你使用内存有限的系统,否则内存泄漏不应该减慢速度。但是,他们可能会导致分配失败,所以最好早点修复它们。 – user3736255