Этот код суетится для выполнения некоторых операций над многочленами (add, sub, mul, div), и все работает рядом с делением.Функция не работает, когда вызывается внутри другой функции
Похоже, когда я вызываю функцию add внутри функции div, она по какой-то причине сбой, но я не понимаю почему.
Вот весь код, Im используя список для хранения полиномов
Функция называется «dividir_polinomios» сбой в этой строке:
p_aaux = sumar_polinomios(p_aaux,p_sumaaux);
Я не понимаю, почему это крах, если я называю тот же функция Main, с теми же полиномами, это работает, я действительно с плохим временем здесь, потому что я не привык к программе на C.
Вот на-структуру я использую:
struct poli{
float cons;
unsigned char exp;
struct poli *sig;
};
Вот функция дополню:
struct poli *sumar_polinomios(struct poli* p_a, struct poli *p_b){
struct poli *res=NULL;
struct poli *aux=NULL;
struct poli *aux_a,*aux_b;
aux_a=p_a;
aux_b=p_b;
while(aux_a || aux_b){
aux=(struct poli*)malloc(sizeof(struct poli));
if(aux_a->exp == aux_b->exp){
aux->cons=aux_a->cons+aux_b->cons;
aux->exp=aux_a->exp;
aux->sig=NULL;
res=crear_lista(res,aux);
aux_a=aux_a->sig;
aux_b=aux_b->sig;
}
else if(aux_a->exp > aux_b->exp){
aux->cons=aux_a->cons;
aux->exp=aux_a->exp;
aux->sig=NULL;
res=crear_lista(res,aux);
aux_a=aux_a->sig;
}
else if(aux_a->exp < aux_b->exp){
aux->cons=aux_b->cons;
aux->exp=aux_b->exp;
aux->sig=NULL;
res=crear_lista(res,aux);
aux_b=aux_b->sig;
}
}
return res;
};
Вот функция ДИВ:
void dividir_polinomios(struct poli *p_a, struct poli *p_b){
struct poli *p_aaux=p_a;
struct poli *p_baux=p_b;
struct poli *aux;
struct poli *cuociente=NULL;
struct poli *p_sumaaux=NULL;
struct poli *p_ressuma;
while(1){
//CONDICION PARA ROMPER WHILE AQUI//
//Termino del cuociente
aux = (struct poli*)malloc(sizeof(struct poli));
aux->cons = p_aaux->cons/p_baux->cons;
aux->exp = p_aaux->exp - p_baux->exp;
aux->sig=NULL;
cuociente=crear_lista(cuociente,aux);
//printf("TEST: constante: %.2f\nexponente: %d",aux->cons,aux->exp);
//Multiplicar termino por p_baux
p_sumaaux=multiplicar_polinomios(p_baux,aux);
//Invertir signo para realizar la suma
p_sumaaux=cambiar_signo(p_sumaaux);
printf("polinomio a:\n");
mostrar_lista(p_aaux);
printf("\npolinomio p_summaux:\n");
mostrar_lista(p_sumaaux);
//Sumar p_aaux + p_summaux
printf("\n\nAhora exploto");
p_aaux = sumar_polinomios(p_aaux,p_sumaaux); //<--THIS CRASH
//Se quita el primer elemento
p_aaux=p_aaux->sig;
mostrar_lista(p_aaux);
}
};
А вот функция я использую для создания списков
struct poli *crear_lista(struct poli *lista,struct poli *nodo){
struct poli *aux;
if(!lista){
lista=nodo;
}
else{
aux=lista;
while(aux->sig!=NULL){
aux=aux->sig;
}
aux->sig=nodo;
}
return lista;
}
В принципе, если Я использовал этот ввод: (я на самом деле не хранил «х», просто константы и exp).
Poly_a = -20x^5 + 37x^3 -8x^2 - 15x
Poly_b = 4x^2-5
он должен хранить в "cuociente" следующий результат:
-5x^3 + 3x-2
Но вместо этого сбой кода, когда «sumar_polinomnios» вызывается внутри «divir_polinomios».
EDIT:
мне удалось решить эту проблему, проблема была в «sumar_polinomios» и это потому, что aux_b значение в списке достигают NULL быстрее, чем aux_a список, поэтому, когда aux_b список является пустым, и я сделал некоторые сравнение как
aux_a->exp == aux_b->exp
он разбился, потому что aux_b был пустым, поэтому я сделал это.
struct poli *sumar_polinomios(struct poli** p_a, struct poli **p_b){
struct poli *res=NULL;
struct poli *aux=NULL;
struct poli *aux_a,*aux_b;
aux_a=(*p_a);
aux_b=(*p_b);
while(aux_a || aux_b){
aux=(struct poli*)malloc(sizeof(struct poli));
//printf("\nestoy aqui\n");
//printf("\nexp_a:%d\texp_b:%d\n",aux_a->exp,aux_b->exp);
if(aux_a && aux_b){
if(aux_a->exp == aux_b->exp){
//printf("exponentes iguales\n");
aux->cons=aux_a->cons+aux_b->cons;
aux->exp=aux_a->exp;
aux->sig=NULL;
crear_lista(&res,aux);
aux_a=aux_a->sig;
aux_b=aux_b->sig;
//printf("fin exponentes iguales\n");
}
else if(aux_a->exp > aux_b->exp){
//printf("exponenten a > exponente b");
aux->cons=aux_a->cons;
aux->exp=aux_a->exp;
aux->sig=NULL;
crear_lista(&res,aux);
aux_a=aux_a->sig;
//printf("fin exponenten a > exponente b");
}
else if(aux_a->exp < aux_b->exp){
//printf("exponente a < exponente b");
aux->cons=aux_b->cons;
aux->exp=aux_b->exp;
aux->sig=NULL;
crear_lista(&res,aux);
aux_b=aux_b->sig;
//printf("fin exponente a < exponente b");
}
}
else if(aux_a!=NULL){
aux->cons=aux_a->cons;
aux->exp=aux_a->exp;
aux->sig=NULL;
crear_lista(&res,aux);
aux_a=aux_a->sig;
}
else{
aux->cons=aux_b->cons;
aux->exp=aux_b->exp;
aux->sig=NULL;
crear_lista(&res,aux);
aux_b=aux_b->sig;
}
}
return res;
}
Теперь я проверяю, если оба списка не NULL, а если один из них является пустым я просто добавьте не-нулевой список в списке результатов.
Моя немедленная реакция: «Это действительно MCVE ([MCVE])?» Я надеюсь, что там есть больше кода, чем необходимо, чтобы показать проблему, потому что (для Stack Overflow) это довольно много кода. Кроме того, вам нужно отобразить ввод образца, текущий вывод и ожидаемый результат и объяснение того, что по-другому. Почему не повторяющийся код, который читает полиномы, вычисленные в функцию? –
Между прочим, функции не завершаются символом '};', который после пустой функции имеет пустое объявление. Некоторые компиляторы жалуются; другие - нет. –
Почему функция деления не возвращает значение? Пропускает ли он выделенные полиномы (или если бы он не сбой)? Это хорошая идея? –