2015-09-29 1 views
2

J'essaie de créer un tableau bidimensionnel dynamique (auquel cas j'ai réussi à le faire). J'ai une classe qui comprend quelques constructeurs, un destructeur et d'autres fonctions qui traitent des opérations arithmétiques sur la matrice. alors voici le code complet:Erreur de segmentation (core dumped 139)

#include <iostream> 
#include <stdint.h> 
using namespace std; 
int n,m,input,i,j; 

class Matrix{ 
    int **matrix; 
    int i,j,codeError; 
    public: 
     Matrix(); 
     Matrix(int); 
     Matrix(int, int); 
     Matrix(const Matrix&, int, int); 
     ~Matrix(); 
     void setIJ(int, int); 
     int getIJ(int, int); 
     void set(int,int); 
     void position(); 
     void plus(const Matrix&,const Matrix&,int, int); 
     void minus(const Matrix&,const Matrix&,int, int); 
     void multiply(const Matrix&,const Matrix&,int, int); 
     //void multiply(int,int,int); 
     void print(int, int); 
    }; 
Matrix a,b,c,d,e; 
Matrix::Matrix(){ 

     matrix=NULL; 
     i=0; 
     j=0; 
    } 
Matrix::Matrix(int n){ 
    matrix=new int*[n]; 
    for(i=0;i<n;i++) 
    matrix[i]=new int[n]; 
    for (int i=0;i<n;i++){ 
     for(int j=0;j<n;j++){ 
      if(i==j) 
      matrix[i][j]=1; 
      else matrix[i][j]=2; 
      } 
     } 
    } 

Matrix::Matrix(int m, int n){ 
    matrix=new int*[n]; 
    for(i=0;i<n;i++) 
    matrix[i]=new int[m]; 
    for (int i=0;i<n;i++){ 
     for(int j=0;j<m;j++){ 
      if(i==j) 
      matrix[i][j]=0; 
      else matrix[i][j]=1; 
      } 
     } 
} 


Matrix::Matrix(const Matrix &obj,int n, int m) 

    { 
     matrix=new int*[n]; 
    for(i=0;i<n;++i) 
    matrix[i]=new int[m]; 
     for (int i=0;i<n;i++){ 
      for (int j=0; j<n; j++){ 
        matrix[i][j]=obj.matrix[i][j]; 
       } 
      } 
     } 

Matrix::~Matrix(){ 
    delete [] matrix; 
} 


void Matrix::set(int n, int m){ 
    matrix=new int*[n]; 
    for(i=0;i<n;++i) 
    matrix[i]=new int[m]; 

    for (i=0;i<n;i++){ 
     for(j=0;j<m;j++){ 
      cin>>matrix[i][j]; 
      } 
     } 
    } 
void Matrix::setIJ(int i, int j){ 
     int num; 
     cout<<"matrix[i][j]="<<endl; 
     cin>>num; 
     matrix[i][j]=num; 
     } 


int Matrix::getIJ(int i, int j){ 
    return matrix[i][j]; 
    } 

void Matrix::plus(const Matrix &obj,const Matrix &tmp,int n,int m){ 
    matrix=new int*[n]; 
    for(i=0;i<n;i++) 
    matrix[i]=new int [m]; 
    for(i=0;i<n;i++){ 
     for(j=0;j<m;j++){ 
      matrix[i][j]=tmp.matrix[i][j]+obj.matrix[i][j]; 
     } 
    } 
} 

void Matrix::minus(const Matrix &obj,const Matrix &tmp,int n,int m){ 
    matrix=new int*[n]; 
    for(i=0;i<n;i++) 
    matrix[i]=new int [m]; 
    for(i=0;i<n;i++){ 
     for(j=0;j<m;j++){ 
      matrix[i][j]=tmp.matrix[i][j]-obj.matrix[i][j]; 
     } 
    } 
} 

void Matrix::multiply(const Matrix &obj,const Matrix &tmp,int n,int m){ 
    matrix=new int*[n]; 
    for(i=0;i<n;i++) 
    matrix[i]=new int [m]; 
    int temp1=0,temp2=0; 
    for(i=0;i<n;i++){ 
     for(j=0;j<m;j++){ 
      for(int k=0;k<n;k++){ 
      temp1=tmp.matrix[i][k]; 
      temp2=obj.matrix[k][j]; 
      matrix[i][j]+=temp1*temp2; 
      } 
     } 
    } 
} 

/*void Matrix::multiply(int n,int m,int scalar){ 

    matrix=new int*[n]; 
    for(i=0;i<n;i++) 
    matrix[i]=new int [m]; 
    for(i=0;i<n;i++){ 
     for(j=0;j<m;j++){ 
      matrix[i][j]*=scalar; 
     } 
    } 
}*/ 

void Matrix::print(int n, int m){ 
    for(int i=0;i<n;i++){ 
     cout<<endl; 
     for(int j=0;j<m;j++){ 
      cout<<" "<<matrix[i][j]; 
      } 
     } 
    } 

int main(){ 
     menu: 
    cout<<"menu"<<endl; 
    cout<<"1.Constructor without parameters"<<endl; 
    cout<<"2.Constructor 1 parameter"<<endl; 
    cout<<"3.Constructor 2 parameters"<<endl; 
    cout<<"4.copy constructor"<<endl; 
    cout<<"5.change number on IJ position"<<endl; 
    cout<<"6.what is the number on IJ position"<<endl; 
    cout<<"7.adition"<<endl; 
    cout<<"8.substraction"<<endl; 
    cout<<"9.multiply"<<endl; 
    cout<<"10.print"<<endl; 

    cin>>input; 
    switch(input){ 
     case 1:{ 
      Matrix a; 
      cout<<"write n si m"<<endl; 
      cin>>n>>m; 
      a.set(n,m); 
      goto menu; 
      } 
     case 2:{ 
      Matrix b(3); 
      goto menu; 
      } 
     case 3:{ 
      Matrix c(3,4); 
      goto menu; 
      } 
     case 4:{ 
      Matrix d(a); 
      goto menu; 
      } 
     case 5:{ 
      cout<<"write i,j"<<endl; 
      cin>>i>>j; 
      a.setIJ(i,j); 
      goto menu; 
      } 
     case 6:{ 
      cout<<"itnrodu i,j"<<endl; 
      cin>>i>>j; 
      a.getIJ(i,j); 
      goto menu; 
      } 
     case 7:{ 
      e.plus(a,d,n,m); 
      goto menu; 
      } 
     case 8:{ 
      e.minus(a,d,n,m); 
      goto menu; 
      } 
     /*case 9:{ 

      }*/ 
     case 10:{ 
      a.print(n,m); 
      b.print(3,3); 
      c.print(3,4); 
      d.print(n,m); 
      e.print(n,m); 

      goto menu; 
      } 
     } 
    } 

donc avant d'inclure l'instruction switch dans la fonction principale, tout fonctionnait parfaitement normal en appelant manuellement chaque fonction. maintenant, cependant, les 4 premières instructions switch fonctionnent correctement, mais quand je vais dans les 5-10 cas, j'obtiens la faute Segmentation (core dumped 139). i essayé le débogage du code et il me montre que le problème est toujours quand j'assigne la matrice [i] [j] à quelque chose d'autre, par exemple ici:

void Matrix::setIJ(int i, int j){ 
    int num; 
    cout<<"matrix[i][j]="<<endl; 
    cin>>num; 
    **matrix[i][j]=num;**<-here 
    } 

ou ici:

void Matrix::plus(const Matrix &obj,const Matrix &tmp,int n,int m){ 
matrix=new int*[n]; 
for(i=0;i<n;i++) 
matrix[i]=new int [m]; 
for(i=0;i<n;i++){ 
    for(j=0;j<m;j++){ 
     **matrix[i][j]=tmp.matrix[i][j]+obj.matrix[i][j];**<-here 
    } 
} 

}

Je sais que quelque chose doit être avec des pointeurs, mais je suis encore un débutant dans la programmation s'il vous plaît aidez-moi

+0

Avant le 'goto' dans le bloc' case 1: ', gdb dit (avec la commande'pa') que:' $ 6 = {matrix = 0x603010 , i = 2, j = 2, codeError = 4201344} 'et après le' goto menu' il est dit que '$ 10 = {matrice = 0x0, i = 0, j = 0, codeErreur = 0}'. On dirait que «un» disparaît. – Missu

+0

Vous pouvez jeter un oeil sur: [Quel est le problème avec goto] (http://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto) et [pourquoi les variables ne peuvent-elles pas être déclarées dans un déclaration de commutateur] (http://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement). J'espère que cela t'aidera. – Missu

+0

@Missu merci pour la réponse. J'ai changé toutes les variables de l'instruction switch et les ai mises au début de la fonction principale, maintenant les variables s'initialisent au démarrage du programme. ce n'est pas joli mais bon, au moins le problème est parti. merci beaucoup pour la poussée dans la bonne direction! – erdboden

Répondre

0

Voici le problème. Vous créez des objets Matrix sous la portée de case. Mais comme dit par Lightness Races in Orbit:

[...] des objets avec la durée de stockage automatique ne sont pas "fuite" lorsque vous goto hors de leur portée

et:

[n3290 : 6.6/2]: à la sortie d'une étendue (quelle que soit sa réalisation), les objets ayant une durée de stockage automatique (3.7.3) qui ont été construits dans cette portée sont détruits dans l'ordre inverse de leur construction . [..]

Ainsi, lorsque le goto est fait et vous avez quitté le champ d » case, Matrix objets créés dans le champ seront détruire. C'est pourquoi lorsque vous l'utilisez après, vous obtenez un Segmentation fault (core dumped 139)