我的素数生成器崩溃并被Windows 10关闭

时间:2016-08-20 11:38:13

标签: c++

我过去也使用过代码块,但从来没有遇到过这样的问题。

我在数字1到1000之间写了一个素数生成器,当我点击build>构建并运行,我得到一个对话框,"一个问题导致程序停止正常工作......"我只有一个选择,那就是关闭程序。

关闭程序后,我在控制台窗口看到的是"进程返回255(0xFF)"。当我关闭控制台窗口时,我看到白色文字用红色突出显示"处理终止,状态为-1073741510"。

在重置我的电脑之前,相同的程序运行得很好。它在Windows 10上运行。

任何帮助将不胜感激。

我的代码是 -

Tools -> Options -> Environment -> Fonts and Colors

1 个答案:

答案 0 :(得分:3)

您是否尝试过使用调试器?我拿了你的代码,在内循环中的++前面添加了缺少的facts,然后看:

$ g++ -std=c++14 -Wall -Wextra -Wpedantic -ggdb test.cpp
$ gdb ./a.out
+(gdb) run

Starting program: /home/???/src/a.out 

Program received signal SIGFPE, Arithmetic exception.
0x0000000000400702 in main () at test.cpp:8
8               if(i % j == 0) {
+(gdb)

如果我在该行之前添加诊断cout << i << ' ' << j << std::endl,那么所有打印的都是这个......

0 0

... gdbSIGFPE失败之前。因此,第一次尝试时循环失败。为什么?因为modulo是除法的另一面,所引用的行试图除以零。你不能除以零。 Do not try to divide by zero.

为什么呢?好吧 - 以及在(扶手椅?)数学家之间引起无休止的争论, - 在C和C ++中,除以0是调用未定义行为的许多oopses之一。你需要尽早学习这个概念。编译器不需要阻止您执行此类操作。但该行为使您的整个程序无效并容易爆炸。我的CPU引发了硬件异常。你可能会做同样的事情,可能会做其他的事情...... UB意味着程序可以任何事情 - 包括看似工作正常,直到它在一个不相关的区域神秘地失败并离开你追逐红鲱鱼几个小时,直到你找到尴尬的原因。 相信我。这就是我们不调用UB的原因。

您的代码中可能存在其他错误,但这是最明显的 - 也很容易找到 - 错误。并且as drescherjm pointed out ...

  

for(int j = 0; j < (i + 1); i++)应为for(int j = 2; j < (i + 1); j++),然后将(facts > 2)更改为(facts > 1)

...由于您的数字错误,所以尝试除以0正在发生。

  

在重置我的电脑之前,相同的程序运行得很好。它在Windows 10上运行。

再次:未定义的行为意味着任何事情都可能发生。明天或当风向变化恰到好处时,它可能会开始看似再次工作。这并不意味着什么。调用UB的代码格式不正确,必须不惜一切代价避免使用。