Visualizzazione risultati 1 fino 5 di 5

Discussione: segmentation fault c/c++

  1. #1
    Guest

    Predefinito segmentation fault c/c++

    Ciao a tutti!
    ho cominciato da poco con il C/C++
    Oggi stavo completando un programma che calcola la divisione tra due polinomi. Dopo aver visto che funzionava, stavo cominciando a modificarlo mettento la divisione come sottoprogramma per un programma che calcoli l'MCD. Il programma non è ancora terminato, ho soltanto spostato la procedura di divisione in sottoprogramma (si può vedere ancora questa parte sotto commento prima dello spostamento). Facendo una prova, non riesco a capire per quale motivo il programma funziona correttamente fino al punto in cui mi stampa SEGMENTATION FAULT e non continua più. (il punto che dovrebbe stampare è almeno una parte di quella sottostante il commento che vi indica fin dove funziona.
    Non so bene cosa voglia dire segmentation fault, ho provato a ritoccare qualcosa ma non ne vengo a capo..
    un'altra cosa: il programma prima della modifica funzionava correttamente, però il modo in cui ho implementato il problema, trattando una frazione con 2 vettori, mi sembra troppo sciocco.. c'e chi mi può suggerisce un modo migliore?avevo pensato a record e struct ma non mi sembrava si potessero adattare (sono alle prime armi e si vede,penso)
    Vi ringrazio per l'attenzione e vi scrivo qui sotto il codice:


    #include<iostream.h>
    #include<math.h>
    //divisione polinomi
    double somman(double,double,double,double);
    double sommad(double,double,double,double);
    double prodn(double,double,double,double);
    double prodd(double,double,double,double);
    const int dim=50;
    void divpol(int&,int&,double*,double*,double*,double*,d ouble*,double*,double[][dim],double[][dim]);
    int main(){
    int i,gradoa,gradob,j,q,p,z,indice;
    //double uno,a,b,c,d;
    double quozn[50],quozd[50],an[50],ad[50],bn[50],bd[50],mn[50][50],md[50][50],s[50];
    double cn[50],cd[50],dn[50],dd[50],gradoc;
    bool nostampa,MCD;
    cout.precision(15);
    //uno=1;
    cout<<"inserire grado polinomio A e grado polinomio B\n";
    cin>>gradoa>>gradob;
    cout<<"aquisizione e stampa polinomi a e b\n";
    cout<<"inserire coefficienti (in fraz)di ogni grado di A ";
    for (i=1;i<=gradoa+1;i++){
    cin>>an[i];
    cin>>ad[i];}
    cout<<"inserire coefficienti (fraz)di ogni grado di B ";
    for (i=1;i<=gradob+1;i++){
    cin>>bn[i];
    cin>>bd[i];}
    cout<<"\nstampa polinomio A\n";
    for (i=1;i<=gradoa+1;i++){
    cout<<an[i]<<"/"<<ad[i]<<"*x^"<<gradoa+1-i;
    if (i!=gradoa+1) cout<<" + ";}
    cout<<"\nstampa polinomio B\n";
    for (i=1;i<=gradob+1;i++){
    cout<<bn[i]<<"/"<<bd[i]<<"*x^"<<gradob+1-i;
    if (i!=gradob+1) cout<<" + ";}
    cout<<"\n\n";

    /*quozn[1]=an[1]*bd[1];
    quozd[1]=ad[1]*bn[1];
    cout<<"\t\t\tcoeff. di quoz. n°1= "<<quozn[1]<<"/"<<quozd[1]<<"\n";
    for (j=1;j<=gradoa-gradob+1;j++){
    for(i=j,q=1;i<=gradoa+1;i++,q++){
    if (j==1){
    if (q<=gradob+1){
    a=quozn[1];b=quozd[1];c=bn[i];d=bd[i];
    s[1]=(prodn(a,b,c,d))*(-1);
    s[2]=prodd(a,b,c,d);
    a=s[1];b=s[2];c=an[i];d=ad[i];
    mn[j][i]=somman(a,b,c,d);
    md[j][i]=sommad(a,b,c,d);}
    else{
    mn[j][i]=an[i];
    md[j][i]=ad[i];}
    cout<<mn[j][i]<<"/"<<md[j][i]<<" ";}
    else{
    if (q<=gradob+1){
    a=quozn[j];b=quozd[j];c=bn[q];d=bd[q];
    s[1]=(prodn(a,b,c,d))*(-1);
    s[2]=prodd(a,b,c,d);
    a=s[1];b=s[2];c=mn[j-1][i];d=md[j-1][i];
    mn[j][i]=somman(a,b,c,d);
    md[j][i]=sommad(a,b,c,d);}
    else{
    mn[j][i]=mn[j-1][i];
    md[j][i]=md[j-1][i];}
    cout<<mn[j][i]<<"/"<<md[j][i]<<" ";}
    }
    quozn[j+1]=mn[j][j+1]*bd[1];
    quozd[j+1]=md[j][j+1]*bn[1];
    cout<<"\n\t\t\tcoeff. di quoz. success"<<j+1<<"= "<<quozn[j+1]<<"/"<<quozd[j+1]<<endl;
    }*/
    divpol(gradoa,gradob,quozn,quozd,an,ad,bn,bd,mn,md );

    cout<<"\t\t\tquesto ultimo coeff.di quoziente non conta\n\n";
    //stampa quoziente
    z=gradoa-gradob;
    cout<<"quoziente = ";
    for (p=1;p<=(gradoa-gradob+1);p++)
    cout<<quozn[p]<<"/"<<quozd[p]<<"*x^"<<z+1-p<<" ";

    //da qui non stampa più nulla e dà segmentation fault
    nostampa=true;MCD=true;

    cout<<"\nresto = ";
    indice=1;
    for (p=1;p<=q;p++){
    if ((mn[j-1][p]==0)&&(nostampa));
    else {
    nostampa=false;
    cout<<mn[j-1][p]<<"/"<<md[j-1][p]<<" ";
    cn[indice]=mn[j-1][p];
    cd[indice]=md[j-1][p];
    indice++;
    MCD=false;
    }}
    cout<<endl;
    if (MCD) cout<<"il quoziente è l'MCD\n";
    else {
    cout<<"resto = ";
    for (i=1;i<indice;i++)
    cout<<cn[i]<<"/"<<cd[i]<<"*x^"<<indice-1-i<<" ";}
    gradoc=indice-2;
    if (!MCD)cout<<"\ngradoc = "<<gradoc<<endl;
    return 0;}

    double somman(double a,double b, double c, double d){
    double prod,d1,d2,cn;
    if ((a!=0)&&(c!=0)){
    if ((b!=0)&&(d!=0)){
    prod=b*d;
    d1=prod/b;
    d2=prod/d;
    cn=((d1*a)+(d2*c));}
    else
    if (b==0) cn=c;
    else if (d==0) cn=a;}
    else if ((a==0)&&(c==0)) cn=0;
    else if (a==0) cn=c;
    else cn=a;
    return cn;}

    double sommad(double a,double b, double c, double d){
    double cd;
    if ((a!=0)&&(c!=0)){
    if ((b!=0)&&(d!=0))
    cd=b*d;
    else if (b==0) cd=d;
    else cd=b;}
    else if ((a==0)&&(c==0)) cd=0;
    else if (a==0) cd=d;
    else cd=b;
    return cd;}

    double prodn(double a,double b, double c, double d){
    double cn;
    if ((a!=0)&&(b!=0)&&(c!=0)&&(d!=0)) cn=a*c;
    else cn=0;
    return cn;}

    double prodd(double a,double b, double c, double d){
    double cd;
    if ((a!=0)&&(b!=0)&&(c!=0)&&(d!=0)) cd=b*d;
    else cd=0;
    return cd;}


    void divpol(int &gradoa,int&gradob,double quozn[],double quozd[],double an[],double ad[],double bn[],double bd[],double mn[][dim],double md[][dim]){
    int i,q,j;
    double a,b,c,d,s[50];

    quozn[1]=an[1]*bd[1];
    quozd[1]=ad[1]*bn[1];
    cout<<"\t\t\tcoeff. di quoz. n°1= "<<quozn[1]<<"/"<<quozd[1]<<"\n";
    for (j=1;j<=gradoa-gradob+1;j++){
    for(i=j,q=1;i<=gradoa+1;i++,q++){
    if (j==1){
    if (q<=gradob+1){
    a=quozn[1];b=quozd[1];c=bn[i];d=bd[i];
    s[1]=(prodn(a,b,c,d))*(-1);
    s[2]=prodd(a,b,c,d);
    a=s[1];b=s[2];c=an[i];d=ad[i];
    mn[j][i]=somman(a,b,c,d);
    md[j][i]=sommad(a,b,c,d);}
    else{
    mn[j][i]=an[i];
    md[j][i]=ad[i];}
    cout<<mn[j][i]<<"/"<<md[j][i]<<" ";}
    else{
    if (q<=gradob+1){
    a=quozn[j];b=quozd[j];c=bn[q];d=bd[q];
    s[1]=(prodn(a,b,c,d))*(-1);
    s[2]=prodd(a,b,c,d);
    a=s[1];b=s[2];c=mn[j-1][i];d=md[j-1][i];
    mn[j][i]=somman(a,b,c,d);
    md[j][i]=sommad(a,b,c,d);}
    else{
    mn[j][i]=mn[j-1][i];
    md[j][i]=md[j-1][i];}
    cout<<mn[j][i]<<"/"<<md[j][i]<<" ";}
    }
    quozn[j+1]=mn[j][j+1]*bd[1];
    quozd[j+1]=md[j][j+1]*bn[1];
    cout<<"\n\t\t\tcoeff. di quoz. success"<<j+1<<"= "<<quozn[j+1]<<"/"<<quozd[j+1]<<endl;}
    }

  2. #2
    L'avatar di radioradianti
    radioradianti non è connesso Utente storico
    Data registrazione
    26-11-2003
    Residenza
    Roma
    Messaggi
    1,000

    Predefinito

    Citazione Originalmente inviato da pingux
    //da qui non stampa più nulla e dà segmentation fault
    nostampa=true;MCD=true;

    cout<<"\nresto = ";
    indice=1;
    for (p=1;p<=q;p++){
    if ((mn[j-1][p]==0)&&(nostampa));
    Dai uno sguardo alla riga in grassetto.
    Mi sembra un po strana, che cosa fa?


    Ciao

    Leandro

    Happy Slack!

    E' on line il numero 12 di Topolinux - Totalmente rinnovato!
    TopoLinux è anche chat! irc.azzurra.org canale #topolinux
    La semplicità di questo dono è inversamente proporzionale alla qualità della nostra amicizia

  3. #3
    Guest

    Predefinito

    quel paragrafetto mi dovrebbe memorizzare nei 2 nuovi array il quoziente della divisione senza gli eventuali numeri nulli antecedenti il primo numero non nullo (cioè senza levarmi zeri dopo tale numero). è indubbiamente impostato malino, ma dici che il problema consista in quella riga?secondo il mio ragionamento: mentre non trova un numero che non sia zero, non mi deve memorizzare nulla, quindi ho lasciato quell'istruzione vuota. Quando trova un numero != 0 NOSTAMPA diventa falso e quindi non mi elimina più nulla. Che dici?

  4. #4
    Guest

    Predefinito

    usa i code taaaaaaaaaaaaaaaaaags :°°°° non si legge niente :\ -> [/code][code]

    per il codice: j non è inizializzato a nessun valore da quel che vedo, quindi j-1 crasherà sicuramente il tuo programma

  5. #5
    Guest

    Predefinito

    Grazie, infatti non ho tenuto conto che dopo lo spostamento nel sottoprogramma la variabile j non aveva più il valore che m'aspettavo..che sbadato..

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •