#c
#c
Вопрос:
У меня написан следующий код. После того, как я запускаю код, он работает нормально, пока не попытается выполнить функцию add2Poly. После этого я получаю ошибку сегментации. Я новичок в программировании, поэтому не могу понять, в чем его причина.
#include lt;stdio.hgt; #include lt;stdlib.hgt; struct poly{ double power[5]; double* coeff; }; struct poly add2Poly(struct poly add1, struct poly add2) { struct poly p3; p3.coeff = malloc(5 * sizeof * p3.coeff); printf("We will add the two polynomials and put the result in a third polynomial p3."); int size1 = sizeof(add1.coeff); int size2 = sizeof(add2.coeff); for(int i = 0; i lt; size1; i ) { int power = add1.power[i]; for(int j= 0; j lt; size2; j ) { if( power == add2.power[j]) { p3.coeff[i] = add1.power[i] add2.power[j]; p3.power[i] = add2.power[j]; } } } return p3; } int main(){ struct poly p1; p1.coeff = malloc(5 * sizeof * p1.coeff); double a; printf("Please enter a double value for poly1 coeff:"); scanf("%lf", amp;a); double b; printf("Please enter a double value for poly1 coeff:"); scanf("%lf", amp;b); p1.coeff[1] = a; p1.coeff[2] = b; printf("Power of poly1: "); scanf("%lf", amp;p1.power[1]); printf("Power poly2: "); scanf("%lf", amp;p1.power[2]); printf("p1: %.1fx^%.1f", p1.coeff[1], p1.power[1]); printf(" %.1fx^%.1fn", p1.coeff[2], p1.power[2]); struct poly p2; p2.coeff = malloc(5 * sizeof * p2.coeff); double c; printf("Please enter a double value for poly2 coeff:"); scanf("%lf", amp;c); double d; printf("Please enter a double value for poly2 coeff:"); scanf("%lf", amp;d); p2.coeff[1] = c; p2.coeff[2] = d; printf("Power of poly1: "); scanf("%lf", amp;p2.power[1]); printf("Power poly2: "); scanf("%lf", amp;p2.power[2]); printf("p2: %.1fx^%.1f", p2.coeff[1], p2.power[1]); printf(" %.1fx^%.1fn", p2.coeff[2], p2.power[2]); struct poly p3; p3.coeff = malloc(5 * sizeof * p3.coeff); p3 = add2Poly(p1,p2); printf("p3: %.1fx^%.1f", p3.coeff[1], p3.power[1]); printf(" %.1fx^%.1fn", p3.coeff[2], p3.power[2]); }
если быть точным, это дает мне следующую ошибку: segmentation fault(core dumped)
. Я предполагаю, что это как-то связано со структурой p3, но я не уверен.
Комментарии:
1. Какая строка кода вызывает ошибку?
2.
sizeof(add1.coeff)
вернет размер указателя в байтах для удвоения в вашей системе. Вам нужно ввести длину массива в свои функции или сохранить ее в структурах3. Могу я спросить, почему вы выбрали массив из 5 для степеней и динамически распределенный для коэффициентов?
Ответ №1:
Вы хотите инициализировать power
путем add1.power[i]
(строка 18), когда вы еще не присвоено значение add1.power[i]
, потому что на первой итерации i = 0
, то вы еще не присвоено значение add1.power[0]
, но только add1.power[1]
А add1.power[2]
(добавьте 1 = P1) и вы хотите использовать его, это означает, что условный переход зависит от неинициализированное значение : if( power == add2.power[j])
строка 22, power
имеет значение null и add2.power[j]
удалить строки 14 и 15 его не служить тебе, потому что sizeof(add1.coeff)
возвращает размер в байтах указатель на Double в системе : результат = 8 здесь. У вас будет неверное чтение, ваш массив poly.power и poly.coeff имеют размер 5, в то время как вы хотите прочитать до 8 значений. вот почему у вас возникла эта ошибка segmentation fault(core dumped)
, потому что вы хотите получить доступ к ячейке памяти, которая не была выделена для нее.
Начиная с вашей идеи, если вы хотите, чтобы ваш код работал, измените интервал цикла на 1 и 3: потому что инициализируются только poly.power[1]
, poly.power[2]
, poly.coeff[1]
и. poly.power[2]
Также в строках 24 и 25 укажите сумму коэффициентов, а не сумму степеней, чтобы получить коэффициенты 3-го полинома.
Способ, которым вы определяете структуру своего полинома, может быть изменен, зная только степень полинома. Вы также можете избежать вложенного цикла в своей функции add2Poly.
Я надеюсь, что это вас обрадует !
Посмотрите на следующий код:
struct poly add2Poly(struct poly add1, struct poly add2) { struct poly p3; p3.coeff = malloc(5 * sizeof *p3.coeff); printf("We will add the two polynomials and put the result in a third polynomial p3.n"); int size1 = sizeof(add1.coeff);// to delate int size2 = sizeof(add2.coeff);// to delate for (int i = 1; i lt; 3; i ) { int power = add1.power[i]; for (int j = 1; j lt; 3; j ) { if (power == add2.power[j]) { p3.coeff[i] = add1.coeff[i] add2.coeff[i];// do the sum of coefficients and not the sum of power p3.power[i] = add2.power[i]; } } } return p3; }
вот оптимизированное предложение вашей проблемы
#include lt;stdio.hgt; #include lt;stdlib.hgt; struct poly { int degree; double *coeff; // the number of coefficient is equal to degree 1 }; struct poly add2Poly(struct poly p1, struct poly p2) { struct poly p3; struct poly p_min_degree; if (p1.degree gt; p2.degree) {// the degree of the polynomial p3 is the one which has the greatest degree between p1 and p2 p3 = p1; p_min_degree = p2; } else { p3 = p2; p_min_degree = p1; } for (int i = 0; i lt;= p_min_degree.degree; i ) { p3.coeff[i] = p_min_degree.coeff[i]; } return p3; } struct poly create_poly() {// Ask the user to enter the degree of the polynomial and (degree 1) coefficients struct poly p; printf("Power of the polynomial : "); scanf("%d", amp;p.degree); p.coeff = malloc((p.degree 1) * sizeof *p.coeff); for (int i = 0; i lt;= p.degree; i ) {// Read a double as coeff printf("Enter the coeff x^%d : ", i); scanf("%lf", amp;p.coeff[i]); } return p; } void display_poly(struct poly p) {// Displays a polynomial p passed as a parameter //Display example: p degree 2 //p = 3.00x^2 4.00x^1 2.00x^0 printf(" p = "); for (int i = p.degree; i gt;= 0; i--) { printf(" %.2lfx^%d ", p.coeff[i], i); } printf("n"); } int main() { struct poly p1 = create_poly(); display_poly(p1); struct poly p2 = create_poly(); display_poly(p2); struct poly p3 = add2Poly(p1, p2); printf("The sum of p1 p2 is :"); display_poly(p3); }
Комментарии:
1. Я согласен с приведенным выше ответом, что правильно добавлять коэффициенты вместо добавления полномочий. Это то, что вызвало ошибку сегментации, выглядит хорошо в остальном!