我对这个问题的一般性质表示道歉,但我想不出一个好的方法来说出来......简单来说,我是一个初学者,编写了一个程序(在C中,使用CodeBlocks-EP)执行大量的计算(为简单起见,我用无意义的循环替换了真正的(非常有用的)代码,这个循环也有大量的计算!)。
int x, i;
for (i=0; i<9999999999999999; i++){
x=x+1;
x=x-1; //real code is much more useful but spans 3000 lines!
}
printf("x is %i", x); //useful output
正如我所说,它工作正常,并提供有用的输出。然而,最近,我尝试让它在虚拟年度的每一天运行一次,而不是仅仅运行一天,如下所示:
int x, i, day;
for (day=0; day<365; day++){
for (i=0; i<9999999999999999; i++){
x=x+1;
x=x-1; //real code is much more useful but spans 3000 lines!
}
}
printf("x is %i", x); //useful output
我在收到有用的输出之前收到了以下消息:
My_program .exe已停止工作。一个问题导致程序停止正常工作。 Windows将关闭程序并在解决方案可用时通知您。进程终止,状态为-1073741510(24秒)。
在进一步检查时,它在第60天左右停止工作。然而(这里是奇怪的部分......),如果你选择一个较小的时期,例如0-60天,或30-71天,或60-101天(因为第61天因编程问题而没有破坏)。
如果我尝试超过60天(甚至0-70天),它会在大约60天后中断。除了由于“太多的计算”导致它破裂之外,我想不出任何错误......但我从来没有听说过这个问题。我是一个新手,所以任何建议都会在这里受到高度赞赏!
我很欣赏没有实际代码是没有用的,但是在3000行,用更简单的东西替换它似乎是明智的!但是我可以确认它适用于一年中的每一天,当时作为单独的日子运行......只是不是一个块!如果我可以提供任何其他信息,请告诉我。
非常感谢,
马特
更新(2013年12月26日23:21):非常感谢所有回复 - 原来这是内存泄漏,我错过了一行代码重置其中一个计数器,这反过来试图然后制作一个巨大的矩阵...抱歉是一个菜鸟,不知道如何诊断它,但我觉得我已经学到了一些东西;谢谢你的帮助!
答案 0 :(得分:4)
程序在停止工作之前是否可以执行最大数量的计算?
没有。您可能在程序中出现内存泄漏或数字溢出,仅在运行60天后显示。
答案 1 :(得分:1)
如果您有32位系统,则只能循环数字<= 32位。如果你有一个64位系统,你只能循环小于或等于64位的数字。如果你有一个大于32Bit或64Bit的数字,你就会出现溢出。如果你使用999999999999999999
这样的东西,它对于32位寄存器来说是很大的。试试9999999999999999999L
并将i
声明为long
。