30/09/2018, 19:18

Hỏi lỗi cấp phát bộ nhớ động cho mảng 2 chiều

đề bài: Nhập hai ma trận, hiển thị ma trận tổng, sử dụng cấp phát bộ nhớ động cho mảng hai chiều?
e thử chạy chương trình, nhập ma trân bình thường nhưng đến phần hiện ma trận bị lỗi
e sử dụng code:block
mong mn giúp đỡ

   #include <iostream>
using namespace std;
void nmt( int **a, int h, int d);             // hàm nhập ma trận
void cmt( int **a, int **b,int **c, int h, int d);        //hàm cộng ma trận
void hmt (int **a, int h, int d);            // hàm in ma trận
void xmt(int **a,int h);            //hàm xóa ma trận

int main()
{
    int h, d;
    int **a, **b, **c;              //các ma trận a,b,c
    cout<<"Nhap so hang cua ma tran:  ";
    cin>>h;             //số hàng
    cout<<"
Nhap so cot cua ma tran: ";
    cin>>d;             //số cột
    cout<<"Nhap ma tran A: "<<endl;
    nmt(a,h,d);
    cout<<"Nhap ma tran B: "<<endl;
    nmt(b,h,d);

    cmt(a,b,c,h,d);     //tinh tong hai ma tran
    cout<<"Ma tran tong la: "<<endl;
    hmt(c,h,d);
    xmt(a,h);
    xmt(b,h);
    xmt(c,h);
    return 0;
}
void nmt(int **a, int h, int d)
{
    a= new int*[d];
    for(int i=0;i<h;i++)
    {
        a[i] = new int[h];
        for(int j=0;j<d;j++)
            {
                cout<<"
Nhap phan tu hang "<<i+1<<"cot "<<j+1 <<" : ";
                cin>> a[i][j];
            }
    }
    return;
}
void hmt(int **a, int h, int d)
{
    for(int i=0;i<h;i++)

        for(int j=0;j<d;j++)
        {
            cout<<" "<< a[i][j] <<" ";
            cout<<endl;
        }

    return;
}
void cmt(int **a, int **b, int **c, int h, int d)
{
    for(int i=0;i<h;i++)
    for(int j=0;j<d;j++)
    c[i][j] = ( a[i][j]+b[i][j]);
}
void xmt(int **a, int h)
{
    for(int i=0;i<h;i++) delete [] a[i];
    delete [] a;
    return;
}
... viết 21:26 ngày 30/09/2018

void nmt(int *a, int h, int d)
{
a= new int
[d]; //Ở đây bạn cấp phát d con trỏ để quản lý d mảng 1 chiều
for(int i=0;i<h;i++) // Nhưng ở đây bạn lại duyệt qua h con trỏ.
{
a[i] = new int[h];
for(int j=0;j<d;j++)
{
cout<<"\nNhap phan tu hang "<<i+1<<"cot “<<j+1 <<” : ";
cin>> a[i][j];
}
}
return;
}

Mình ghi lỗi trên phần reply, bạn xem thử có đúng không.

minh viết 21:32 ngày 30/09/2018

cám ơn bạn, munhf sửa lại nhưng vẫn chưa chạy đc

void nmt(int **a, int h, int d)
{
a= new int*[h]; //mình sửa d thành h
for(int i=0;i<h;i++) 
{
a[i] = new int[d];  // ình sửa h thành d
for(int j=0;j<d;j++)
{
cout<<"\nNhap phan tu hang "<<i+1<<"cot "<<j+1 <<" : ";
cin>> a[i][j];
}
}
return;

}

... viết 21:26 ngày 30/09/2018

Đâu phải chuyển h thành d rồi d thành h đâu

cấp phát d con trỏ thì lặp d lần để cấp phát tiếp cho d con trỏ tiếp chứ

a = new int*[d];
for(int i = 0; i < d; i++)    {
    a[i] = new int[h];
    for(int j = 0; j < h; j++)    {
        a[i][j] = ???;
    }
}

đại khái là như thế

minh viết 21:24 ngày 30/09/2018

à, ý mình là h là hàng, còn d là cột, nên mihf muốn h trước d, nghĩa là haanfd trước cột
còn bạn sửa là cột trc hàng, mình nghĩ chắc cũng tương tự

Bài liên quan
0