добавление двух полиномов с использованием динамических массивов

#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. Я согласен с приведенным выше ответом, что правильно добавлять коэффициенты вместо добавления полномочий. Это то, что вызвало ошибку сегментации, выглядит хорошо в остальном!