我的质数生成器崩溃了,被Windows 10关闭了

My prime number generator crashes and is closed by Windows 10

本文关键字:Windows 崩溃 我的      更新时间:2023-10-16

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

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

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

在我重置电脑之前,这个程序可以正常运行。在Windows 10上运行

任何帮助都将不胜感激。

我的代码是-

#include <iostream>
using namespace std;
int main() {
  int facts = 0;
  for(int i = 0; i < 1001; i++) {
    facts = 0;
    for(int j = 0; j < (i + 1); i++) {
      if(i % j == 0) {
        facts  ;
      }
    }
    if(facts > 2) {
      cout<<i;
    }
  }
  return 0;
}

您尝试过使用调试器吗?我拿了你的代码,在内循环的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失效之前。因此,循环在第一次尝试时失败。为什么?因为模是除法的另一边,所以引用的行试图除以零。不能除以0。不要试图除以0。

为什么?在C和c++中,除0是调用未定义行为的众多选项之一,这也引起了数学家之间无休止的争论。你需要尽早并且很好地学习这个概念。编译器不需要阻止您做这些事情。但是这个行为使你的整个程序无效并且容易爆炸。我的CPU引发硬件异常。你的可能会做同样的事情,可能会做其他事情……UB意味着程序可以任何的事情——包括看起来工作正常,但它在一个不相关的领域神秘地失败了,让你花几个小时去寻找转移注意力的东西,直到你找到令人尴尬的原因。信任我。这就是为什么我们不调用UB。

在您的代码中可能还有其他错误,但这是最明显的错误,也很容易发现。正如drescherjm所指出的…

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

…试图除以0是因为你的数字是错误的。

在我重置电脑之前,这个程序可以正常运行。在Windows 10上运行

再次说明:未定义行为意味着任何事情都可能发生。它可能开始看起来在明天或当风向改变正确时再次工作。那不代表什么。调用UB的代码是不正确的,必须不惜一切代价避免。