Простейшая задача на алгоритмизацию и SIGSEGV

187
26 ноября 2016, 19:02

Есть простейшая задача: Найти 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;
}

Там есть небольшие логические ошибки в коде, но суть не в них

Answer 1

Проблема у вас здесь:

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() - уже задействовали стек. А если это рекурсивная функция, да ещё и с аргументами, и с какими-то локальными переменными... Так что к стеку относиться стоит бережно :)

Answer 2

Для начала у вас нету элементарных знаний работы с переменными. Я понимаю что вы только учитесь, но необходимо сначала самому попытаться разобраться прежде чем просить о помощи так как вы ничему не научитесь. ИЗ ЯВНЫХ ОШИБОК:

1) bool pr[mdl + 100]; превышен диапазон массива.

И вообще смысл строки не особо понятен. bool имеет всего 2 состояния если 0 ложь и все что выше нуля правда.

SIGSEGV - сама ошибка означает что прыгнуло на ломаный код если совсем просто. Делайте построчную отладку кода и разбирайтесь если вылетает на n-ой строке значит в этой строчке ошибка иногда может и выше.

READ ALSO
Разбор рекурсии числа ряда Фибоначчи

Разбор рекурсии числа ряда Фибоначчи

Добрый вечерНе могу понять действия рекурсивной функции при нахождении числа Фибоначчи

245
Приведение const char* к char*

Приведение const char* к char*

Пытаюсь с QByteArray получить указатель на данные с помощью data(), ругается:

216
is_block_type_valid(header-&gt; _block_use)

is_block_type_valid(header-> _block_use)

Доброго времени суток

469
Повсеместное использование r-value ссылок

Повсеместное использование r-value ссылок

Стоит ли повсеместно стараться как можно чаще использовать r-value ссылки? Вот, допустим, код:

307