2016-05-29 3 views
1

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

+3

Моя немедленная реакция: «Это действительно MCVE ([MCVE])?» Я надеюсь, что там есть больше кода, чем необходимо, чтобы показать проблему, потому что (для Stack Overflow) это довольно много кода. Кроме того, вам нужно отобразить ввод образца, текущий вывод и ожидаемый результат и объяснение того, что по-другому. Почему не повторяющийся код, который читает полиномы, вычисленные в функцию? –

+1

Между прочим, функции не завершаются символом '};', который после пустой функции имеет пустое объявление. Некоторые компиляторы жалуются; другие - нет. –

+1

Почему функция деления не возвращает значение? Пропускает ли он выделенные полиномы (или если бы он не сбой)? Это хорошая идея? –

ответ

2

У вас есть двойная ошибка().

Что происходит в crear_lista, вы выделяете новую голову и прививаете старый хвост из ранее существующего списка, а то, что происходит в monstr_lista, вы освобождаете весь список. Во второй раз это происходит, куча повреждена, поэтому malloc() в конечном итоге возвращает мусор, и вы рухнете.

Решение: скопируйте список nodo в crear_lista.

Смежные вопросы