Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 04.07.2013
Сообщений: 12

Segmentation fault. Программа для сложения многочленов

21.06.2016, 20:30. Показов 975. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем. Мне задали сделать программу по сложению и перемножению многочленов. Написав код для сложения, я столкнулся с ошибкой Segmentation fault. Я знаю что это ошибка работы с памятью, но найти ее в своем листинге я не могу. Буду благодарен за помощь.
Кликните здесь для просмотра всего текста
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <iostream>
 
using namespace std;
 
class polynom 
{
    double *coeff;
    unsigned int degree;
public:
    polynom(): degree(-1)
    {
        coeff = new double;
        *coeff = 0;
    }
    polynom(unsigned int deg): degree(deg)
    {
        coeff = new double[deg+1];
    }
    polynom(double *C, unsigned int deg): degree(deg)
    {
        coeff = new double[deg+1];
        for(int i=0; i<=deg; ++i)
            coeff[i] = C[i];
    }
    ~polynom()
    {
        delete[]coeff;
    }
    polynom(const polynom &P)
    {
        degree = P.degree;
        for(int i=0; i<=degree; ++i)
            coeff[i] = P.coeff[i];
    }
    void display_polynom()const;
    polynom& operator=(const polynom&);
    polynom operator+(const polynom&);
    polynom operator*(const polynom&);
};
 
void polynom::display_polynom()const
{
    cout << coeff[0];
    for(int i=1; i<=degree; ++i)
    {
        cout << " + " << coeff[i] << "*x^" << i;
    }
    cout << endl;
}
 
polynom& polynom::operator=(const polynom &P)
{
    degree = P.degree;
    for(int i=0; i<=degree; ++i)
            coeff[i] = P.coeff[i];
    return *this;
}
polynom polynom::operator+(const polynom &P)
{
    polynom *result;
    if (degree > P.degree)
        {
            result = new polynom(coeff ,degree);
            for(int i=0; i<=P.degree; ++i)
                result->coeff[i] += P.coeff[i];
        }
    else
        {
            result = new polynom(P.coeff, P.degree);
            for(int i=0; i<=degree; ++i)
                result->coeff[i] += coeff[i];
        }
    return *result;
    delete[]result;
}
 
int main()
{
    char answer;
    int deg1 = -1, deg2 = -1;
    while (deg1 < 0)
    {
        cout << "Степень первого полинома: " << endl;
        cin >> deg1;
    }
    double *C;
    C = new double[deg1];
    cout << "Введите " << deg1+1 << " коэффициентов первого полинома" << endl;
    for(int i=0; i<=deg1; ++i)
        cin >> C[i];
    polynom P1(C, deg1);
    delete[]C;
    while (deg2 < 0)
    {
        cout << "Степень второго полинома: " << endl;
        cin >> deg2;
    }
    C = new double[deg2];
    cout << "Введите " << deg2+1 << " коэффициентов второго полинома" << endl;
    for(int i=0; i<=deg2; ++i)
        cin >> C[i];
    polynom P2(C, deg2);
    cout << "Че хотите сделать с полиномами? (+, *)" << endl;
    cin >> answer;
    switch(answer)
    {
        case '+':
            {
                int max_deg;
                if (deg1 < deg2)
                    max_deg = deg2;
                else
                    max_deg = deg1;
                polynom P3(max_deg);
                P3 = P1 + P2; 
                P3.display_polynom();
                break;
            }
    }
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2016, 20:30
Ответы с готовыми решениями:

Программа выводит segmentation fault!
Текст задачи: Структура «Спортивная команда»: - название; - из какого города; - сколько игр сыграла; - сколько набрала...

Segmentation fault
Всем привет. Пишу быдлокод для лабы в универе. Мне по определенному алгоритму необходимо получить из одного поколения особей, новое. ...

Segmentation fault
Почему при таком варианте происходит Segmentation fault? vec3f trace(const Scene&amp; scene, const Ray&amp; ray) { const RenderObject*...

5
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.06.2016, 20:38
Цитата Сообщение от TrickSonix Посмотреть сообщение
coeff = new double;
Цитата Сообщение от TrickSonix Посмотреть сообщение
delete[]coeff;
UB.

Добавлено через 2 минуты
Цитата Сообщение от TrickSonix Посмотреть сообщение
C++
1
2
3
4
5
6
7
polynom& polynom::operator=(const polynom &P)
{
    degree = P.degree;
    for(int i=0; i<=degree; ++i)
          coeff[i] = P.coeff[i];
    return *this;
}
А если P.degree больше degree?

Добавлено через 1 минуту
Да и в самом массиве элементов degree, а вы считаете до (degree+1) т.к. берёте с нуля и включаете верхнюю границу в счётчик цикла.
0
1 / 1 / 0
Регистрация: 04.07.2013
Сообщений: 12
22.06.2016, 05:49  [ТС]
Исправил, но эффект тот же. А элементов в массиве degree+1 так как я в конструкторе выделяю память под degree+1 элемент.
C++
1
2
3
4
5
6
7
8
9
polynom& polynom::operator=(const polynom &P)
{
    degree = P.degree;
    delete[]coeff;
    coeff = new double[degree+1];
    for(int i=0; i<=degree; ++i)
            coeff[i] = P.coeff[i];
    return *this;
}
Добавлено через 5 часов 22 минуты
Немного подправил код, исправив конструктор копирования, и теперь при сложении полиномов получаю ошибку double free or corruption (out). Кажется это переполнение стека, но где неправильный код до сих пор не пойму.
Кликните здесь для просмотра всего текста
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
 
using namespace std;
 
class polynom 
{
    unsigned int degree;
    double *coeff;
public:
    polynom(): degree(-1)
    {
    }
    polynom(unsigned int deg): degree(deg)
    {
        coeff = new double[deg+1];
    }
    polynom(double *C, unsigned int deg): degree(deg)
    {
        coeff = new double[deg+1];
        for(int i=0; i<=deg; ++i)
            coeff[i] = C[i];
    }
    ~polynom()
    {
        delete[]coeff;
    }
    polynom(const polynom &P)
    {
        degree = P.degree;
        delete[]coeff;
        coeff = new double[degree+1];
        for(int i=0; i<=degree; ++i)
            coeff[i] = P.coeff[i];
    }
    void display_polynom()const;
    polynom& operator=(const polynom&);
    polynom operator+(const polynom&);
    polynom operator*(const polynom&);
};
 
void polynom::display_polynom()const
{
    cout << coeff[0];
    for(int i=1; i<=degree; ++i)
    {
        cout << " + " << coeff[i] << "*x^" << i;
    }
    cout << endl;
}
 
polynom& polynom::operator=(const polynom &P)
{
    degree = P.degree;
    delete[]coeff;
    coeff = new double[degree+1];
    for(int i=0; i<=degree; ++i)
            coeff[i] = P.coeff[i];
    return *this;
}
 
polynom polynom::operator+(const polynom &P)
{
    polynom *result;
    if (degree > P.degree)
        {
            result = new polynom(coeff, degree);
            for(int i=0; i<=P.degree; ++i)
                result->coeff[i] += P.coeff[i];
        }
    else
        {
            result = new polynom(P.coeff, P.degree);
            for(int i=0; i<=degree; ++i)
                result->coeff[i] += coeff[i];
        }
    return *result;
    delete[]result;
}
 
int main()
{
    char answer;
    int deg1 = -1, deg2 = -1;
    while (deg1 < 0)
    {
        cout << "Степень первого полинома: " << endl;
        cin >> deg1;
    }
    double *C;
    C = new double[deg1+1];
    cout << "Введите " << deg1+1 << " коэффициентов первого полинома" << endl;
    for(int i=0; i<=deg1; ++i)
        cin >> C[i];
    polynom P1(C, deg1);
    delete[]C;
    while (deg2 < 0)
    {
        cout << "Степень второго полинома: " << endl;
        cin >> deg2;
    }
    C = new double[deg2+1];
    cout << "Введите " << deg2+1 << " коэффициентов второго полинома" << endl;
    for(int i=0; i<=deg2; ++i)
        cin >> C[i];
    polynom P2(C, deg2);
    delete[]C;
    cout << "Че хотите сделать с полиномами? (+, *)" << endl;
    cin >> answer;
    switch(answer)
    {
        case '+':
            {
                polynom P3;
                P3 = P1 + P2; 
                P3.display_polynom();
                break;
            }
    }
    return 0;
}


Добавлено через 3 часа 41 минуту
В общем я поэксперементировал с операторами присваивания и сложения, и сделал вывод что ошибка кроется в операторе сложения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
polynom polynom::operator+(const polynom &P)
{
    polynom *result;
    if (degree > P.degree)
        {
            result = new polynom(coeff, degree); //здесь все в порядке, result инициализируется этими переменными 
            for(int i=0; i<=P.degree; ++i)          //и значения его полей можно вывести на экран
                result->coeff[i] += P.coeff[i];       //И здесь тоже все ок, переменная меняет свое значение и так же выводится
        }
    else
        {
            result = new polynom(P.coeff, P.degree);
            for(int i=0; i<=degree; ++i)
                result->coeff[i] += coeff[i];
        }
    return *result;   // а вот здесь магическим образом и происходит ошибка
    delete[]result;
}
В итоге по результатом моих экспериментов я сделал вывод что он не может/не хочет присвоить оператору сложения значение *result. Самое забавное это то как он выводит ошибку: вылезает ошибка double free or corruption (out) затем в следующей строчке выводятся значения result->coeff[i] (если добавить их вывод в функцию) вместе со строчкой bash: line 12: 10575 Aborted. Как это исправить, ума не приложу.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
22.06.2016, 08:08
Цитата Сообщение от TrickSonix Посмотреть сообщение
return *result; * // а вот здесь магическим образом и происходит ошибка
* * delete[]result;
C++
1
return result;  // Без звезды
До следующей строчки дело вообще не доходит... И слава Богу! Ибо она вообще бредова....
0
1 / 1 / 0
Регистрация: 04.07.2013
Сообщений: 12
22.06.2016, 16:56  [ТС]
Я разобрался с ошибкой сегментации следующим образом:
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
polynom polynom::operator+(const polynom &P)
{
    unsigned int deg;
    double *C;
    if (degree > P.degree)
        {
            deg = degree;
            C = new double[deg+1];
            for(int i=0; i<=degree; ++i)
                C[i] = coeff[i];
            for(int i=0; i<=P.degree; ++i)
                C[i] += P.coeff[i];
        }
    else
        {
            deg = P.degree;
            C = new double[deg+1];
            for(int i=0; i<=P.degree; ++i)
                C[i] = P.coeff[i];
            for(int i=0; i<=degree; ++i)
                C[i] += P.coeff[i];
        }
    while(C[deg] == 0)
        --deg;
    return (C, deg);
}
Но теперь результатом работы программы получается полином из нулей. Но сам массив С не нулевой (проверял выводя его на экран). Как он это делает, не пойму, может в конструкторе что не так?
C++
1
2
3
4
5
6
polynom(double *C, unsigned int deg): degree(deg)
    {
        coeff = new double[deg+1];
        for(int i=0; i<=deg; ++i)
            coeff[i] = C[i];
    }
0
1 / 1 / 0
Регистрация: 04.07.2013
Сообщений: 12
25.06.2016, 19:55  [ТС]
Проблема решена. Не знаю чем был плох предыдущий код, однако все заработало только когда я перегрузил оператор индексирования массива[]. Выкладываю код (Сложение и умножение многочленов) вдруг кому пригодится.
Кликните здесь для просмотра всего текста
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <iostream>
 
using namespace std;
 
class polynom 
{
    unsigned int degree;
    double *coeff;
public:
    polynom(): degree(-1), coeff(NULL)
    {
    }
    polynom(unsigned int deg): degree(deg)
    {
        coeff = new double[deg+1];
        for(int i=0; i<=deg; ++i)
            coeff[i] = 0;
    }
    ~polynom()
    {
        delete[]coeff;
    }
    polynom(const polynom &P)
    {
        degree = P.degree;
        delete[]coeff;
        coeff = new double[degree+1];
        for(int i=0; i<=degree; ++i)
            coeff[i] = P.coeff[i];
    }
    void display_polynom()const;
    polynom& operator=(const polynom&);
    polynom operator+(const polynom&);
    polynom operator*(const polynom&);
    double& operator[](unsigned int);
};
 
void polynom::display_polynom()const
{
    cout << coeff[0];
    for(int i=1; i<=degree; ++i)
    {
        cout << " + " << coeff[i] << "*x^" << i;
    }
    cout << endl;
}
 
polynom& polynom::operator=(const polynom &P)
{
    degree = P.degree;
    delete[]coeff;
    coeff = new double[degree+1];
    for(int i=0; i<=degree; ++i)
            coeff[i] = P.coeff[i];
    return *this;
}
 
polynom polynom::operator+(const polynom &P)
{
    polynom result;
    if (degree > P.degree)
        {
            for(int i=0; i<=degree; ++i)
                result[i] = coeff[i];
            for(int i=0; i<=P.degree; ++i)
                result[i] += P.coeff[i];
        }
    else
        {
            for(int i=0; i<=P.degree; ++i)
                result[i] = P.coeff[i];
            for(int i=0; i<=degree; ++i)
                result[i] += P.coeff[i];
        }
    while(result[degree] == 0)
        result.degree -= 1;
    return result;
}
 
polynom polynom::operator*(const polynom &P)
{
    polynom result(0);
    for(int i=0; i<=degree+P.degree; ++i)
    {
        for(int k=0; k<=i; ++k)
        {
            if(i-k <= P. degree && k<= degree)
                result[i] += coeff[k] * P.coeff[i-k];
        }
    }
    return result;
}
 
double& polynom::operator[](unsigned int s)
{
    if (s<degree+1)
        return coeff[s];
    else
    {
        double *temp_coeff;
        temp_coeff = new double[degree+1];
        for(int i=0; i<degree+1; ++i)
            temp_coeff[i] = coeff[i];
        delete[]coeff;
        coeff = new double[s+1];
        for(int i=0; i<degree+1; ++i)
            coeff[i] = temp_coeff[i];
        for(int i=degree+1; i<s+1; ++i)
            coeff[i] = 0;
        delete[]temp_coeff;
        degree = s;
        return coeff[s];
    }
}
 
int main()
{
    char answer;
    int deg = -1;
    while (deg < 0)
    {
        cout << "Степень первого полинома: " << endl;
        cin >> deg;
    }
    polynom P1;
    cout << "Введите " << deg+1 << " коэффициентов первого полинома" << endl;
    for(int i=0; i<=deg; ++i)
        cin >> P1[i];
    deg = -1;
    while (deg < 0)
    {
        cout << "Степень второго полинома: " << endl;
        cin >> deg;
    }
    polynom P2;
    cout << "Введите " << deg+1 << " коэффициентов второго полинома" << endl;
    for(int i=0; i<=deg; ++i)
        cin >> P2[i];
    cout << "Че хотите сделать с полиномами? (+, *)" << endl;
    cin >> answer;
    switch(answer)
    {
        case '+':
        {
            polynom P3;
            P3 = P1 + P2; 
            P3.display_polynom();
            break;
        }
        case '*':
        {
            polynom P3;
            P3 = P1*P2;
            P3.display_polynom();
            break;
        }
        default:
        {
            cout << "Че ввел?" << endl;
            break;
        }
    }
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2016, 19:55
Помогаю со студенческими работами здесь

Segmentation fault
При выводе второго объекта на экран объекте, вылетает с ошибкой. segmentation fault(core dumped). #include &lt;iostream&gt; using...

Segmentation Fault
void Coder::set(const char * buf, size_t size) { if ((buf == nullptr)) { throw std::logic_error(&quot;buf == nullptr&quot;); } if...

Segmentation fault
Пишу лабу для универа. В общем необходимо использовать только свои функции, никаких, str... подобных функций использовать нельзя. ...

Segmentation fault
Доброго времени суток. Столкнулся в программе с ошибкой Segmentation fault. Вообще, задача отсортировать данные по одному из параметров, но...

Segmentation fault
не могу скинуть код по личным причинам. я использую строковые операторы strcmp, strcpy. выводит ошибку segmetation fault core dump....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru