void sommePoly(Polynome p1 , Polynome p2 , Polynome psom)
В C аргументы передаются путем создания копии значения переменной. Итак, p1
- это копия переменной, которую вы передаете. Вам нужно передать указатели, чтобы изменить значения за указателями. Или верните значение, как в случае Polynome lire_polynome()
.
Обычно я ожидал бы функции:
int lire_polynome(Polynome *p);
int sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom);
Использование некоторого возвращаемого значения, напр. int вы можете вернуть отрицательное или ненулевое число в случае ошибки (например, malloc
error).
То есть ваша функция может выглядеть так:
int sommePoly(Polynome *p1 , Polynome *p2 , Polynome *psom)
{
int degsom, deg1, deg2, i = 0, j = 0, k = 0;
float coeffsum, coeff1, coeff2;
degsom = max(p1->degree, p2->degree);
psom->coeff_tab = malloc((degsom + 1) * sizeof(float));
if (psom->coeff_tab == NULL) { return -1; }
if (p1->degree == p2->degree){
psom->coeff_tab[k] = p1->coeff_tab[i] + p2->coeff_tab[j];
psom->degree = p1->degree;
... // and so on replace psom. to psom-> ie. replace dot with ->
}
return 0;
}
Затем вы называете это передающим указатель на структуры:
Polynome p1;
if (lire_polynome(&p1) != 0) { /* error handling */ }
Polynome p2;
if (lire_polynome(&p2) != 0) { /* error ahdling */ }
Polynome p3;
if (sommePoly(&p1, &p2, &p3) != 0) { /* error handling */ }
- Не забудьте проверить на
scanf
ошибки if (scanf("%f", ...) != 1) { fprintf(stderr, "error in scanf"); exit(1); }
- Не забудьте проверить наличие ошибок malloc.
- Не разыгрывать результат malloc
- Приведение к unsigned long в
(unsigned long)(p.degree+1)*sizeof (float)
странно и довольно подвержено ошибкам. sizeof(...)
имеет тип size_t, который является правильным типом для представления размера, приведение его к unsigned long
является ненужным и может привести к ошибкам в некоторых случаях большого числа. Просто malloc((p.degree + 1) * sizeof(float))
или calloc(p->degree + 1, sizeof(float));
- Получите хорошее прочтение о стиле кодирования ядра Linux .
- Более простой пример передачи указателей и значения модификации можно найти в этой теме .