Kesalahan segmentasi (inti dibuang 139)

Saya mencoba membuat array bidimensi dinamis (dalam hal ini saya berhasil melakukannya). Saya memiliki kelas yang mencakup beberapa konstruktor, destruktor, dan fungsi lain yang berhubungan dengan operasi aritmatika pada matriks. jadi inilah kode keseluruhannya:

  #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;
            }
        }
    }

jadi sebelum memasukkan pernyataan switch ke dalam fungsi utama, semuanya berfungsi normal dengan memanggil setiap fungsi secara manual. Namun sekarang, 4 pernyataan sakelar pertama berfungsi dengan baik menurut saya, tetapi ketika saya melanjutkan ke 5-10 kasus, saya mendapatkan kesalahan Segmentasi (inti dibuang 139). saya mencoba men-debug kode dan itu menunjukkan kepada saya bahwa masalahnya selalu ketika saya menetapkan matriks[i][j] ke sesuatu yang lain, misalnya di sini:

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

atau di sini:

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
    }
}

}

Saya tahu ada sesuatu yang harus dengan petunjuk tetapi saya masih pemula dalam pemrograman tolong bantu saya


person erdboden    schedule 29.09.2015    source sumber
comment
Sebelum goto ke dalam blok case 1:, gdb mengatakan (dengan perintahp a) bahwa : $6 = {matrix = 0x603010, i = 2, j = 2, codeError = 4201344} dan setelah goto menu dikatakan bahwa $10 = {matrix = 0x0, i = 0, j = 0, codeError = 0}. Sepertinya amenghilang muncul.   -  person Missu    schedule 29.09.2015
comment
Anda dapat melihat: apa yang salah dengan goto dan mengapa variabel tidak dapat dideklarasikan dalam pernyataan switch. Saya harap ini akan membantu Anda.   -  person Missu    schedule 29.09.2015
comment
@Missu terima kasih atas balasannya. saya mengubah semua variabel dari pernyataan switch dan meletakkannya di awal fungsi utama, sekarang variabel tersebut benar-benar diinisialisasi ketika program dimulai. itu tidak bagus tapi hei, setidaknya masalahnya sudah hilang. terima kasih banyak atas dorongan ke arah yang benar!   -  person erdboden    schedule 29.09.2015


Jawaban (1)


Inilah masalahnya. Anda membuat Matrix objek di bawah cakupan case. Namun seperti yang dikatakan oleh Lightness Races in Orbit :

[...] objek dengan durasi penyimpanan otomatis tidak "bocor" saat Anda goto keluar dari cakupannya

Dan :

[n3290: 6.6/2]: Saat keluar dari ruang lingkup (bagaimanapun tercapainya), objek dengan durasi penyimpanan otomatis (3.7.3) yang telah dibangun dalam lingkup tersebut dihancurkan dalam urutan kebalikan dari konstruksinya. [..]

Jadi, ketika goto selesai dan Anda meninggalkan cakupan case, Matrix objek yang dibuat di bawah cakupan tersebut akan dimusnahkan. Itu sebabnya ketika Anda menggunakannya setelahnya, Anda mendapatkan Segmentation fault (core dumped 139)

person Missu    schedule 29.09.2015