Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
3 / 3 / 1
Регистрация: 11.03.2015
Сообщений: 27

Ошибка сегментирования (сделан дамп памяти)

11.05.2015, 06:01. Показов 6123. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, уважаемые гуру. Ребят, подскажите пожалуйста, кто в теме. Написал обычную программу на языке с++. Компилирую командой "g++ main.cpp -fopenmp", и компилируется без ошибок. А когда запускаю её на выполнение командой "./a.out ", в терминале пишет: Ошибка сегментирования (сделан дамп памяти)
Подскажите в чём может быть проблема? Причём всё работает, при изменении параметра n<18. т.е. когда n=17 и меньше, всё работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <omp.h>
#include <complex>
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main(int argc, char *argv[]){
    int N = 1;
    int n = 100;
    //typedef complex<double> complexd;
    complex<double> a[int (pow(2,n))];
    for (int i=0; i<pow(2,n);i++){
        a[i] = complex<double>(rand() % 9 + 1 , rand() % 9 + 1);
        //cout<<a[i]<<" ";
    }
    complex<double> b[int (pow(2,n))];
 
    complex<double> U[2][2];
    U[0][0] = complex<double> (0);
    U[0][1] = complex<double> (1);
    U[1][0] = complex<double> (1);
    U[1][1] = complex<double> (0);
 
    omp_set_dynamic(0);      // запретить библиотеке openmp менять число потоков во время исполнения
    omp_set_num_threads(N); // установить число потоков в 10
 
    int power = pow(2,n);
#pragma omp parallel for shared(a, b, U) private(i)
    for (int i = 0; i < power; i++){
        //cout<<(i+1)%4;
        switch ((i+1)%4) {
        case 1:
            b[i] = U[0][0]*a[i]+U[0][1]*a[i+2];
            break;
        case 2:
            b[i] = U[0][0]*a[i]+U[0][1]*a[i+2];
            break;
        case 3:
            b[i] = U[1][0]*a[i-2]+U[1][1]*a[i];
            break;
        case 0:
            b[i] = U[1][0]*a[i-2]+U[1][1]*a[i];
            break;
        default:
            break;
        }
    }
    cout<<("\n");
//    for (int i=0; i<power;i++){
//        cout<<b[i]<<" ";
//    }
    int t = clock();
    cout<<t<< endl;
    cout<<((float)t) / CLOCKS_PER_SEC<<"\n";
    return 0;
}
Всем, кто поможет, отблагодарю плюсиками. Заранее спасибо, ребят.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2015, 06:01
Ответы с готовыми решениями:

Ошибка сегментирования (сделан дамп памяти)
в обще пишу игрушку с помощью sfml библиотек такая пробема на одном из этапов написания после успешной компиляции, я запустил...

Ошибка сегментирования (сделан дамп памяти)
Доброго времени суток. На текущий момент имеется программа, позволяющая выводить различные вариации кристаллической решетки 3*4 элементов...

Ошибка сегментирования (сделан дамп памяти)
В универе задали задание &quot;Реализовать программу определения полного имени файла(подъем по дереву каталогов)&quot; Я в этом деле полный...

3
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
11.05.2015, 06:19
Лучший ответ Сообщение было отмечено Bacek_Tm как решение

Решение

Падает со stack overflow еще до вызова функции main, скорее всего из-за выделения слишком большого массива (a и b). Выделите его динамически через new...
C++
1
2
3
4
5
complex<double> *a = new complex<double>[power];
complex<double> *b = new complex<double>[power];
...
delete[] a;
delete[] b;
А еще вы 4 раза одно и тоже значение считаете: pow(2,n).
1
3 / 3 / 1
Регистрация: 11.03.2015
Сообщений: 27
11.05.2015, 07:04  [ТС]
Someone007, спасибо. это действительно помогло. Но теперь уже при n = 26+ выпадает другая ошибка также при выполнении программы. Я полагаю это от того, что слишком большие значения для компьютера. Всё же как никак показательная степень используется. Выпадает ошибка:
Bash
1
2
3
4
5
6
vasiliy@vasiliy-HP-ProBook-4530s:~/QT projects/Qubit$ g++ main.cpp -fopenmp 
vasiliy@vasiliy-HP-ProBook-4530s:~/QT projects/Qubit$ ./a.out 
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Аварийный останов (сделан дамп памяти)
vasiliy@vasiliy-HP-ProBook-4530s:~/QT projects/Qubit$
Вот что в итоге сейчас получилось по коду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <stdio.h>
#include <omp.h>
#include <complex>
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main(int argc, char *argv[]){
    int N = 1;
    int n = 27;
    //typedef complex<double> complexd;
    int power = int (pow(2,n));
    complex <double> *a = new complex <double>[power];
    complex <double> *b = new complex <double>[power];
    for (int i=0; i<power;i++){
        a[i] = complex<double>(rand() % 9 + 1 , rand() % 9 + 1);
        //cout<<a[i]<<" ";
    }
 
    complex<double> U[2][2];
    U[0][0] = complex<double> (0);
    U[0][1] = complex<double> (1);
    U[1][0] = complex<double> (1);
    U[1][1] = complex<double> (0);
 
    omp_set_dynamic(0);      // запретить библиотеке openmp менять число потоков во время исполнения
    omp_set_num_threads(N); // установить число потоков в 10
 
#pragma omp parallel for shared(a, b, U) private(i)
    for (int i = 0; i < power; i++){
        //cout<<(i+1)%4;
        switch ((i+1)%4) {
        case 1:
            b[i] = U[0][0]*a[i]+U[0][1]*a[i+2];
            break;
        case 2:
            b[i] = U[0][0]*a[i]+U[0][1]*a[i+2];
            break;
        case 3:
            b[i] = U[1][0]*a[i-2]+U[1][1]*a[i];
            break;
        case 0:
            b[i] = U[1][0]*a[i-2]+U[1][1]*a[i];
            break;
        default:
            break;
        }
    }
    cout<<("\n");
//    for (int i=0; i<power;i++){
//        cout<<b[i]<<" ";
//    }
    delete[] a;
    delete[] b;
    int t = clock();
    cout<<t<< endl;
    cout<<((float)t) / CLOCKS_PER_SEC<<"\n";
    return 0;
}
Добавлено через 3 минуты
Someone007, а подскажите ещё пожалуйста про функцию clock(), я хочу замерить время работы программы. А эта функция выдаёт не соответствующее время работы самой программы. Т.е. пишет, что проработала 18.5629 секунд, а на самом деле секунд 5.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
11.05.2015, 07:29
2^27=0x08000000, 0x08000000*8*2=0x80000000 байт = минимум 2 ГБ памяти (а скорее всего даже больше, зависит от внутреннего устройства std::complex, у меня выделилось 4 ГБ при 27 степени на 64 битной винде и не упало). Это значение в int не укладывается, но падает скорее всего из-за нехватки памяти.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <omp.h>
#include <complex>
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
int main(int argc, char *argv[]){
    clock_t t = clock();
    int N = 1;
    int n = 27;
    //typedef complex<double> complexd;
    int power = int(pow(2, n));
    complex <double> *a = new complex <double>[power];
    complex <double> *b = new complex <double>[power];
    for (int i = 0; i < power; i++){
        a[i] = complex<double>(rand() % 9 + 1, rand() % 9 + 1);
        //cout<<a[i]<<" ";
    }
 
    complex<double> U[2][2];
    U[0][0] = complex<double>(0);
    U[0][1] = complex<double>(1);
    U[1][0] = complex<double>(1);
    U[1][1] = complex<double>(0);
 
    omp_set_dynamic(0);      // запретить библиотеке openmp менять число потоков во время исполнения
    omp_set_num_threads(N); // установить число потоков в 10
 
#pragma omp parallel for shared(a, b, U) private(i)
    for (int i = 0; i < power; i++){
        //cout<<(i+1)%4;
        switch ((i + 1) % 4) {
        case 1:
            b[i] = U[0][0] * a[i] + U[0][1] * a[i + 2];
            break;
        case 2:
            b[i] = U[0][0] * a[i] + U[0][1] * a[i + 2];
            break;
        case 3:
            b[i] = U[1][0] * a[i - 2] + U[1][1] * a[i];
            break;
        case 0:
            b[i] = U[1][0] * a[i - 2] + U[1][1] * a[i];
            break;
        default:
            break;
        }
    }
    cout << ("\n");
    //    for (int i=0; i<power;i++){
    //        cout<<b[i]<<" ";
    //    }
    delete[] a;
    delete[] b;
 
    t = clock() - t;
    cout << t << endl;
    cout << ((float)t) / CLOCKS_PER_SEC << "\n";
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.05.2015, 07:29
Помогаю со студенческими работами здесь

Ошибка сегментирования (сделан дамп памяти)
Доброй ночи Подскажите как при программировании на C++ под LINUX (UBUNTU) избавиться от ошибки Ошибка сегментирования (сделан дамп...

Ошибка сегментирования (сделан дамп памяти)
Проблема в том, что когда я создаю вектор и увеличиваю у него длину путём добавления нового элемента, происходит вот такая вот вещь...

Ошибка сегментации(дамп памяти)
Возникает ошибка сегментации. Ошибка связана с методом calcultr(). Не знаю почему так происходит.

Ошибка сегментирования (сделан дамп памяти)
простенькая прога. #include &lt;stdio.h&gt; main () { int c, i, nwhite, nother; int ndigit; nwhite = nother = 0; for (i = 0; 1...

Разделяемая память linux, Ошибка сегментирования (сделан дамп памяти)
здравствуйте! помогите с задачей. Четыре дочерних процесса выполняют некоторые циклы работ, передавая после окончания ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru