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

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

21.06.2016, 20:30. Показов 565. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2016, 20:30
Ответы с готовыми решениями:

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

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

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

Segmentation fault
При выводе второго объекта на экран объекте, вылетает с ошибкой. segmentation fault(core dumped). ...

5
Форумчанин
Эксперт CЭксперт С++
8169 / 5017 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
21.06.2016, 20:38 2
Цитата Сообщение от 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  [ТС] 3
Исправил, но эффект тот же. А элементов в массиве 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
26093 / 16280 / 3497
Регистрация: 24.12.2010
Сообщений: 35,687
22.06.2016, 08:08 4
Цитата Сообщение от TrickSonix Посмотреть сообщение
return *result; * // а вот здесь магическим образом и происходит ошибка
* * delete[]result;
C++
1
return result;  // Без звезды
До следующей строчки дело вообще не доходит... И слава Богу! Ибо она вообще бредова....
0
1 / 1 / 0
Регистрация: 04.07.2013
Сообщений: 12
22.06.2016, 16:56  [ТС] 5
Я разобрался с ошибкой сегментации следующим образом:
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  [ТС] 6
Проблема решена. Не знаю чем был плох предыдущий код, однако все заработало только когда я перегрузил оператор индексирования массива[]. Выкладываю код (Сложение и умножение многочленов) вдруг кому пригодится.
Кликните здесь для просмотра всего текста
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2016, 19:55

Segmentation Fault
void Coder::set(const char * buf, size_t size) { if ((buf == nullptr)) { throw...

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

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

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

Segmentation fault
Пытаюсь реализовать генетический алгоритм на с++. Всего существует два класса: GeneticEngine,...

Segmentation fault
Здравствуйте. Нужно динамически получить такое: char * a = {&quot;abc&quot;, NULL}; Пробую: char ** a; a...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.