Есть простейшая задача: Найти k-ое простое число.
Я без труда вспомнил алгоритм и начал писать, но через некоторое время появились проблемы.
Я заметил, что при запуске программа даже не спрашивает число на ввод. Это меня удивило и я полез отлаживать программу.
Мне сразу написали про SIGSEGV. Подобная ситуация некоторое время назад была с другой программой, но тогда я подумал, что просто криво написал код.
Что это может быть? Может ли быть с этим связано то, что некоторое время назад я устанавливал на винду драйвер для подключения ext, но в итоге восстанавливал home и root разделы?
Теперь немного технической информации:
Дистрибутив: arch linux 64
IDE: qtCreator
*.pro: стандартный
Компилятор: gcc
Код:
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
const int mdl = 15485864;
bool pr[mdl + 100];
int k;
cin >> k;
pr[1] = false;
for (int i = 2; i <= 15485864; i++)
pr[i] = true;
int dl = 2;
for(int i = 1; i <= 6; i++)
{ //---
int j = dl * dl;
pr[j] = false;
for(j; j <= mdl; j += dl)
pr[j] = false;
//---
if (i == 2)
i = 3;
else
i += 2;
}
return 0;
}
Там есть небольшие логические ошибки в коде, но суть не в них
Проблема у вас здесь:
const int mdl = 15485864;
bool pr[mdl + 100];
Данные такого объёма выделять на стеке нельзя, используйте new
:
bool *pr = new bool[mdl+100]; // не забудьте потом освободить
Ещё одна мелочь, вот тут:
for(j; j <= mdl; j += dl)
или:
for(; j <= mdl; j += dl)
или (логичней, и тогда строка int j = dl * dl;
не нужна):
for(int j = dl * dl; j <= mdl; j += dl)
данные какого объёма можно выделять на стеке
Стек вообще не предназначен для храннеия объёмных данных. Если компилятор выделяет для стека тот же мегабайт, то это не значит, что и вы можете выделять там этот мегабайт. Стек - рабочая лошадка, которая используется как явно (при объявлении локальных нестатических переменных), так и неявно. Например, при любом вызове функции. Как для передачи параметров, так и для организации самого вызова. То есть написали вы func()
- уже задействовали стек. А если это рекурсивная функция, да ещё и с аргументами, и с какими-то локальными переменными... Так что к стеку относиться стоит бережно :)
Для начала у вас нету элементарных знаний работы с переменными. Я понимаю что вы только учитесь, но необходимо сначала самому попытаться разобраться прежде чем просить о помощи так как вы ничему не научитесь. ИЗ ЯВНЫХ ОШИБОК:
1) bool pr[mdl + 100]; превышен диапазон массива.
И вообще смысл строки не особо понятен. bool имеет всего 2 состояния если 0 ложь и все что выше нуля правда.
SIGSEGV - сама ошибка означает что прыгнуло на ломаный код если совсем просто. Делайте построчную отладку кода и разбирайтесь если вылетает на n-ой строке значит в этой строчке ошибка иногда может и выше.
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый вечерНе могу понять действия рекурсивной функции при нахождении числа Фибоначчи
Пытаюсь с QByteArray получить указатель на данные с помощью data(), ругается:
Стоит ли повсеместно стараться как можно чаще использовать r-value ссылки? Вот, допустим, код: