Announcement

Collapse
No announcement yet.

Giúp mình sữa lỗi hàm tổng 2 ma trận

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] Giúp mình sữa lỗi hàm tổng 2 ma trận

    PHP Code:
    #include <iostream>
    #include <iomanip>
    #include <conio.h>
    #include <new>
    using namespace std;
    class 
    matrix
    {
        
    int r,c;
        
    int **a;
    public:
        
    matrix();
        
    matrix(matrix &);
        ~
    matrix();
        
    friend istream &operator >>(istream &, matrix &);
        
    friend ostream &operator <<(ostream &, matrix &);
        
    friend matrix &operator +(const matrix &, const matrix &);
        
    friend matrix operator *(const matrix &, const matrix &);
    };
    matrix::matrix()
    {
    }
    matrix::matrix(matrix &p)
    {
        
    int i,j;
        
    c=p.c;
        
    r=p.r;
        
    a=new int*[r];
        for(
    i=0;i<c;i++)
        {
            
    a[i]=new int [c];
        }
        for(
    i=0;i<r;i++)
            for(
    j=0;j<c;j++)
                
    a[i][j]=p.a[i][j];
    }
    matrix::~matrix()
    {
        for(
    int i=0;i<r;i++)
            
    delete []a[i];
        
    delete[]a;
    }
    istream &operator >>(istream &nhapmatrix &p)
    {
        
    int i,j;
        
    cout<<"\nNhap so hang: ";
        
    cin>>p.r;
        
    cout<<"\nNhap so cot: ";
        
    cin>>p.c;
        
    p.a=new int*[p.r];
        for(
    i=0;i<p.c;i++)
        {
            
    p.a[i]=new int [p.c];
        }
        if(
    p.a==NULL)
        {
            
    cout<<"\nKhong du bo nho!";
            exit(
    1);
        }
        for(
    i=0;i<p.r;i++)
         for(
    j=0;j<p.c;j++)
         {
             
    cout<<"\nNhap phan tu thu a["<<i<<"]["<<j<<"]: ";
             
    cin>>p.a[i][j];
         }
         return 
    nhap;
    }
    ostream &operator <<(ostream &xuatmatrix &p)
    {
        for(
    int i=0;i<p.r;i++)
        {
         for(
    int j=0;j<p.c;j++)
            
    cout<<setw(3)<<p.a[i][j];
            
    cout<<endl;
        }
        return 
    xuat;
    }
    matrix &operator +(const matrix &p1, const matrix &p2)
    {
        
    int i,j;
        if(
    p1.c==p2.c&&p1.r==p2.r)
        {
            
    matrix p;
            
    p.c=p1.c;
            
    p.r=p1.r;
            
    p.a=new int *[p.r];
            for(
    i=0;i<p.c;i++)
                
    p.a[i]=new int [p.r];
            for(
    i=0;i<p.r;i++)
                for(
    j=0;j<p.c;j++)
                    
    p.a[i][j]=p1.a[i][j]+p2.a[i][j];
            return 
    p;
        }
        else
            
    cout<<"\nMa tran khong cung cap!";
    }
    matrix operator *(const matrix &p1,const matrix &p2)
    {
        
    int i,j,k;
        if(
    p1.c==p2.c&&p1.r==p2.r)
        {
            
    matrix p;
            
    p.c=p1.c;
            
    p.r=p1.r;
            
    p.a=new int *[p.r];
            for(
    i=0;i<p.c;i++)
                
    p.a[i]=new int [p.r];
            for(
    i=0;i<p.r;i++)
                for(
    j=0;j<p.c;j++)    
               {
                 
    p.a[i][j]=0;
                    for(
    k=1;k<=p.c;k++)
                    {
                        
    p.a[i][j]+=p1.a[i][k]*p2.a[k][j];
                    }
              }
            return 
    p;
        }
        else
            
    cout<<"\nMa tran khong cung cap!";
    }

    int main()
    {
        
    matrix p,p1;
        
    cout<<"\nNhap ma tran p1 \n";
        
    cin>>p1;
        
    cout<<"\nXuat ma tran p1: \n"<<p1;
        
    matrix p2(p1);
        
    cout<<"xuat ma tran p2 \n"<<p2;
        
    p=p1+p2;
        
    cout<<"\nTong hai ma tan la: \n"<<p;
        
    p1=p1*p2;
        
    cout<<"\nTich hai ma tran la: \n: "<<p;
        
    p1.~matrix();
        
    p2.~matrix();
        
    p.~matrix();
        
    getch();
        return 
    0;

    lỗi ở đây là cuối hàm tổng, tích thì phải return một lớp matrix,
    nó chạy đến đây thì bị văng ra. hình như là lỗi truy cập vào bộ nhớ đã xóa. nếu xóa hàm
    ~matrix
    thì ok nhưng yêu cầu đề bài phải có. biết lỗi nhưng không sửa được. ai biết chỉ cho mình với nha.
    :love:
    Tương lai khóc hay cười phụ thuộc vào độ lười của quá khứ.
    :cry:

  • #2
    hình như bị lỗi chỗ phần else của các hàm tổng và tích đấy
    coi lại đi
    nó phải được trả ra kiểu giá trị khi else chứ
    hiểu ý chứ

    Comment


    • #3
      Originally posted by 10520130 View Post
      hình như bị lỗi chỗ phần else của các hàm tổng và tích đấy
      coi lại đi
      nó phải được trả ra kiểu giá trị khi else chứ
      hiểu ý chứ
      hix nếu là vậy nhưng nó vẫn bị mắc lỗi ở chỗ return anh kìa. ở đây khi nó return thì phải khởi tạo và hủy một lớp mới. cho nên nó bị truy cập vào vùng nhớ đã xóa nak
      :love:
      Tương lai khóc hay cười phụ thuộc vào độ lười của quá khứ.
      :cry:

      Comment


      • #4
        Originally posted by 11520139 View Post
        PHP Code:
        #include <iostream>
        #include <iomanip>
        #include <conio.h>
        #include <new>
        using namespace std;
        class 
        matrix
        {
            
        int r,c;
            
        int **a;
        public:
            
        matrix();
            
        matrix(matrix &);
            ~
        matrix();
            
        friend istream &operator >>(istream &, matrix &);
            
        friend ostream &operator <<(ostream &, matrix &);
            
        friend matrix &operator +(const matrix &, const matrix &);
            
        friend matrix operator *(const matrix &, const matrix &);
        };
        matrix::matrix()
        {
        }
        matrix::matrix(matrix &p)
        {
            
        int i,j;
            
        c=p.c;
            
        r=p.r;
            
        a=new int*[r];
            for(
        i=0;i<c;i++)
            {
                
        a[i]=new int [c];
            }
            for(
        i=0;i<r;i++)
                for(
        j=0;j<c;j++)
                    
        a[i][j]=p.a[i][j];
        }
        matrix::~matrix()
        {
            for(
        int i=0;i<r;i++)
                
        delete []a[i];
            
        delete[]a;
        }
        istream &operator >>(istream &nhapmatrix &p)
        {
            
        int i,j;
            
        cout<<"\nNhap so hang: ";
            
        cin>>p.r;
            
        cout<<"\nNhap so cot: ";
            
        cin>>p.c;
            
        p.a=new int*[p.r];
            for(
        i=0;i<p.c;i++)
            {
                
        p.a[i]=new int [p.c];
            }
            if(
        p.a==NULL)
            {
                
        cout<<"\nKhong du bo nho!";
                exit(
        1);
            }
            for(
        i=0;i<p.r;i++)
             for(
        j=0;j<p.c;j++)
             {
                 
        cout<<"\nNhap phan tu thu a["<<i<<"]["<<j<<"]: ";
                 
        cin>>p.a[i][j];
             }
             return 
        nhap;
        }
        ostream &operator <<(ostream &xuatmatrix &p)
        {
            for(
        int i=0;i<p.r;i++)
            {
             for(
        int j=0;j<p.c;j++)
                
        cout<<setw(3)<<p.a[i][j];
                
        cout<<endl;
            }
            return 
        xuat;
        }
        matrix &operator +(const matrix &p1, const matrix &p2)
        {
            
        int i,j;
            if(
        p1.c==p2.c&&p1.r==p2.r)
            {
                
        matrix p;
                
        p.c=p1.c;
                
        p.r=p1.r;
                
        p.a=new int *[p.r];
                for(
        i=0;i<p.c;i++)
                    
        p.a[i]=new int [p.r];
                for(
        i=0;i<p.r;i++)
                    for(
        j=0;j<p.c;j++)
                        
        p.a[i][j]=p1.a[i][j]+p2.a[i][j];
                return 
        p;
            }
            else
                
        cout<<"\nMa tran khong cung cap!";
        }
        matrix operator *(const matrix &p1,const matrix &p2)
        {
            
        int i,j,k;
            if(
        p1.c==p2.c&&p1.r==p2.r)
            {
                
        matrix p;
                
        p.c=p1.c;
                
        p.r=p1.r;
                
        p.a=new int *[p.r];
                for(
        i=0;i<p.c;i++)
                    
        p.a[i]=new int [p.r];
                for(
        i=0;i<p.r;i++)
                    for(
        j=0;j<p.c;j++)    
                   {
                     
        p.a[i][j]=0;
                        for(
        k=1;k<=p.c;k++)
                        {
                            
        p.a[i][j]+=p1.a[i][k]*p2.a[k][j];
                        }
                  }
                return 
        p;
            }
            else
                
        cout<<"\nMa tran khong cung cap!";
        }

        int main()
        {
            
        matrix p,p1;
            
        cout<<"\nNhap ma tran p1 \n";
            
        cin>>p1;
            
        cout<<"\nXuat ma tran p1: \n"<<p1;
            
        matrix p2(p1);
            
        cout<<"xuat ma tran p2 \n"<<p2;
            
        p=p1+p2;
            
        cout<<"\nTong hai ma tan la: \n"<<p;
            
        p1=p1*p2;
            
        cout<<"\nTich hai ma tran la: \n: "<<p;
            
        p1.~matrix();
            
        p2.~matrix();
            
        p.~matrix();
            
        getch();
            return 
        0;

        - Nhìn sơ qua thấy, ở 2 toán tử + và * của em á. Ma trận p chứa kết quả trả về , nhưng em lại khai báo là local variable , nên khi hết tầm vực 2 toán tử này thì p sẽ bị hủy --> gọi destructor --> con trỏ thành viên Matrix::a sẽ bị giải phóng vùng nhớ . Mà em lại trả về tham chiếu tới đối tượng này mới chết. Em tham chiếu tới vùng nhớ đã hủy , nên việc xuất giá trị của đối tượng matrix này ở hàm main sẽ lỗi. Vài cách sửa;
        + C1.Em thêm static vô : thành static Matrix p;
        +C2. Em sửa kiểu trả về là matrix thôi, không trả về tham chiếu để cho nó tự sao chép kết quả , nhưng để làm cách này bắt buộc implement đầy đủ : copy contructor , toán tử gán, destructor. ( sao chép ở dạng deep copy nhé )
        - ở 2 toán tử em viết, có trường hợp không return dù kiểu trả về là Matrix , xem kỹ nha, đừng viết code ẩu kiểu này.
        - ở hàm main, không cần gọi tường minh các destructor nha.
        -Khi lớp có thành viên là pointer thì em nên viết đầu đủ : copy contructor , toán tử gán, destructor. ( sao chép ở dạng deep copy nhé )

        Im a british accent lover

        Comment


        • #5
          Originally posted by 08520016 View Post
          - Nhìn sơ qua thấy, ở 2 toán tử + và * của em á. Ma trận p chứa kết quả trả về , nhưng em lại khai báo là local variable , nên khi hết tầm vực 2 toán tử này thì p sẽ bị hủy --> gọi destructor --> con trỏ thành viên Matrix::a sẽ bị giải phóng vùng nhớ . Mà em lại trả về tham chiếu tới đối tượng này mới chết. Em tham chiếu tới vùng nhớ đã hủy , nên việc xuất giá trị của đối tượng matrix này ở hàm main sẽ lỗi. Vài cách sửa;
          + C1.Em thêm static vô : thành static Matrix p;
          +C2. Em sửa kiểu trả về là matrix thôi, không trả về tham chiếu để cho nó tự sao chép kết quả , nhưng để làm cách này bắt buộc implement đầy đủ : copy contructor , toán tử gán, destructor. ( sao chép ở dạng deep copy nhé )
          - ở 2 toán tử em viết, có trường hợp không return dù kiểu trả về là Matrix , xem kỹ nha, đừng viết code ẩu kiểu này.
          - ở hàm main, không cần gọi tường minh các destructor nha.
          -Khi lớp có thành viên là pointer thì em nên viết đầu đủ : copy contructor , toán tử gán, destructor. ( sao chép ở dạng deep copy nhé )
          hihi cảm ơn anh nhiều nhiều nhé. mà anh ơi cách 2 đó anh nói rõ cái code cho em chút được không? hixx em chưa đọc đến đó anh nak
          :love:
          Tương lai khóc hay cười phụ thuộc vào độ lười của quá khứ.
          :cry:

          Comment


          • #6
            Originally posted by 11520139 View Post
            hihi cảm ơn anh nhiều nhiều nhé. mà anh ơi cách 2 đó anh nói rõ cái code cho em chút được không? hixx em chưa đọc đến đó anh nak
            watch & learn http://www.mediafire.com/view/?ihwabj4wu738noq
            Khoảng cách giữa bạn và ước mơ của bạn là bao xa ?

            Comment


            • #7
              phải chi em được học môn phương pháp lập trình hướng đối tượng nhỉ. Còn nhiều điều chưa hiểu quá :unhappy:

              Originally posted by 09520019 View Post
              not..

              Comment

              LHQC

              Collapse
              Working...
              X