Мой генератор простых чисел падает и закрывается Windows 10

c++

68 просмотра

1 ответ

В прошлом я также использовал кодовые блоки, но никогда не сталкивался с такой проблемой.

Я написал генератор простых чисел между числами от 1 до 1000, и когда я нажимаю на «build> build and run», я получаю диалоговое окно «Проблема вызвала некорректную работу программы ...», и у меня есть только одна опция, то есть закрыть программу.

После того, как я закрываю программу, я вижу в окне консоли «Процесс возвратил 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;
}
Автор: Thomas Источник Размещён: 08.11.2019 11:15

Ответы (1)


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

... прямо перед gdbнеудачей с SIGFPE. Итак, цикл завершается неудачно с 1-й попытки. Почему? Поскольку по модулю другая сторона деления, указанная строка пытается делить на ноль. Вы не можете делить на ноль. Не пытайтесь делить на ноль.

Почему? Ну, - а также вызывая бесконечные споры среди (кресла?) Математиков, - в C и C ++ деление на ноль является одной из многих опций, которые вызывают неопределенное поведение . Вы должны изучить эту концепцию, рано и хорошо. Компилятор не обязан мешать вам делать такие вещи. Но этот акт делает всю вашу программу недействительной и склонной к взрыву. Мой процессор вызывает аппаратное исключение. Ваш может сделать то же самое, может сделать что-то еще ... UB означает, что программа может делать все что угодно - в том числе, казалось бы, работать нормально, пока она таинственным образом не сработает в несвязанной области и заставит вас часами гоняться за красными сельдями, пока вы не найдете смущающую причину. Доверьтесь мне. Вот почему мы не вызываем UB.

Возможно, в вашем коде есть и другие ошибки, но это наиболее очевидная и легко обнаруживаемая. И, как указал Дрещерйм ...

for(int j = 0; j < (i + 1); i++)должно быть for(int j = 2; j < (i + 1); j++)затем изменить (facts > 2)на(facts > 1)

... попытка деления на 0 происходит потому, что ваши цифры неверны.

Та же самая программа работала идеально до того, как я перезагрузил свой компьютер. Он работает на Windows 10.

Опять же: неопределенное поведение означает, что все может случиться . Может показаться, что он снова начнет работать завтра или когда направление ветра изменится как раз. Это ничего не значит. Код, вызывающий UB, плохо сформирован, и его следует избегать любой ценой.

Автор: underscore_d Размещён: 20.08.2016 12:14
Вопросы из категории :
32x32