Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 25 kết quả

Đề tài: Cấp phát động bộ nhớ gặp lỗi không nhập được giá trị cho ma trận trong C++.

  1. #1
    Ngày gia nhập
    11 2010
    Bài viết
    24

    Mặc định Cấp phát động bộ nhớ gặp lỗi không nhập được giá trị cho ma trận trong C++.

    Em đang làm bài tập xây dựng lớp ma trận và thực hiện các phép toán với ma trận.Khi nhập giá trị vào ma trận thì chương trình chỉ cho phép nhập giá trị hàng và cột của ma trận nhưng khi em nhập các giá trị của ma trận thì nó báo lỗi "Unhandled exception at 0x59efdf48 (msvcp100d.dll) in Matrix.exe: 0xC0000005: Access violation writing location 0xcdcdcdd5."
    .Các bác giúp em xem em sai ở chỗ nào với.chương trình của em đây ạ:
    File matran.h
    Code:
    #ifndef _MATRAN_H
    #define _MATRAN_H
    #include <iostream>
    using std::istream;
    using std::ostream;
    class matran
    {
    private:
    	int row , col ;
    	double **a ;
    public:
    	matran(const int rowsize, const int colsize);
    	matran(const int rowsize);
    	matran(matran& A);
    	matran(void);
    	virtual ~matran();//ham huy
    	// Khoi tao va gan/dat cac gia tri ma tran
    	void New(const int rowsize, const int colsize);//tao ma tran day du
    	void New(const int rowsize);//tao ma tran cot
    	matran& Eye(void);//tao ma tran don vi
    	friend istream &operator>>(istream & , matran &);
    	friend ostream &operator<<(ostream & , const matran &);
    	//da nang hoa toan tu xuat nhap
    	friend ostream& operator<<(ostream& ,const matran& x);
    	friend istream& operator>>(istream& ,matran& x);
    	// Dinh nghia lai cac phep toan giua so thuc va ma tran
    	matran& Copy(const matran& A);
    	matran operator/ (const double value);
    	matran operator* (const matran& A);
    	matran operator* (const double value);
    	friend matran operator* (double value, const matran& A);
    	matran operator- (const matran& A);
    	matran operator+ (const matran& A);
    	matran& operator= (const matran& A);
    };
    #endif
    File .cpp

    Code:
    #include <iostream>
    #include<iomanip>
    #include <cstdlib>
    using std::exit;
    using std::cout;
    using std::cin;
    using std::endl;
    using std::istream;
    using std::ostream;
    using std::setw;
    #include "matran.h"
    matran::matran(const int rowsize, const int colsize)
    {
    	if( rowsize <= 0 || colsize <= 0 )	
    		a=NULL;
    
    	row = rowsize;
    	col = colsize;
    
    	a = (double **) new double [row];
    	for( int i = 0; i < row; i++ )	
    		a[i] = new double [col];
    }
    
    matran::matran(const int rowsize)
    {
    	if( rowsize <= 0 )	return;
    
    	row = rowsize;
    	col = 1;
    
    	a = (double **) new double [row];
    	for( int i = 0; i < row; i++ )	
    		a[i] = new double [col];
    }
    
    matran::matran(matran& A)
    {
    	if( A.row <= 0 )	row = 1;
    	if( A.col <= 0 )	col = 1;
    
    	row = A.row;
    	col = A.col;
    
    	a = (double **) new double [row];
    	for( int i = 0; i < row; i++ )	
    		a[i] = new double [col];
    
    	for( int r = 0; r < row; r++ )
    		for( int c = 0; c < col; c++ )
    			a[r][c] = A.a[r][c];
    }
    
    matran::matran(void)
    {
    	row = 1;
    	col = 1;
    
    	a = (double **) new double [row];
    	for( int i = 0; i < row; i++ )	
    		a[i] = new double [col];
    }
    
    
    // Destruction --------------------------------------------------------------
    matran::~matran()
    {
                   for( int i = 0; i < row; ++i )
    				   delete []a[i];
                   delete []a;
    }
    
    matran& matran::Eye()//ma tran don vi
    {
    	for( int r = 0; r < row; r++ )
    		for( int c = 0; c < col; c++ )
    			if( r == c )	a[r][c] = 1.;
    			else a[r][c] = 0.;
    	return *this;
    }
    // Tao ra matrix moi --------------------------------------------------------
    
    // Matrix cot
    void matran::New(const int rowsize)
    {
    	if( rowsize <= 0 )	return;
    	row = rowsize;
    	col = 1;
    	a = (double **) new double [row];
    	for( int i = 0; i < row; i++ )	
    		a[i] = new double [col];
    }
    
    // Matrix day du
    void matran::New(const int rowsize, const int colsize)
    {
    	if( rowsize <= 0 || colsize <= 0 )	return;
    	row = rowsize;
    	col = colsize;
    	if( row <= 0 || col <= 0 )	return;
    
    	a = (double **) new double [row];
    	for( int i = 0; i < row; i++ )	
    		a[i] = new double [col];
    }
    //toan tu nhap xuat
    
    istream& operator>>(istream& is,matran& x)
    {
    	cout<<"\nNhap vao so hang cua ma tran:";
    	is>>x.row;
    	cout<<"\nNhap vao so cot cua ma tran ";
    	is>>x.col;
    	cout<<"Nhap cac phan tu cua ma tran : \n";
    	for(int i=1;i<=x.row;++i)
    		for(int j=1;j<=x.col;++j)
    		{
    			cout<<"a["<<i<<" , "<<j<<"]=";
    			is>>x.a[i][j];
    		}
    		return is;
    
    }
    ostream& operator<<(ostream& os,const matran &b)
    {
    	int i,j;
    	for(i=0;i<(b.col*6);i++)
    		os<<"-";
    	for(i=1;i<=b.row;i++)
    	{ 
    		os<<"\n";
    		for(j=1;j<=b.col;j++)
    			os<<setw(6)<<b.a[i][j];
    	}
    	return os;
    	for(i=0;i<(b.col*6);i++)
    		os<<"-";
    }
    // Cac phep toan voi ma tran --------------------------------------------------
    
    // Copy lai nguyen matrix
    matran& matran::Copy(const matran &A)
    {
    	// Kiem tra de khoi tao ma tran tuong ung
    	if( row == 1 && col == 1 )
    		New(A.row, A.col);
    
    	if( row == A.row && col == A.col )
    	{
    		for( int r = 0; r < row; r++ )
    			for( int c = 0; c < col; c++ )
    				a[r][c] = A.a[r][c];
    	}
    	return *this;// Tra ve chinh ma tran nay
    }
    
    // Phep gan A = B
    matran& matran::operator =(const matran& A)
    {
    	return Copy(A);
    }
    
    // Phep cong ma tran
    matran matran::operator +(const matran& A)
    {
    	matran T(row, col);
    	for( int r = 0; r < row; r++ )
    		for( int c = 0; c < col; c++ )
    			T.a[r][c] = a[r][c] + A.a[r][c];
    
    	return matran(T);
    }
    
    // Phep tru ma tran
    matran matran::operator -(const matran &A)
    {
    	matran T(row, col);
    	for( int r = 0; r < row; r++ )
    		for( int c = 0; c < col; c++ )
    			T.a[r][c] = a[r][c] - A.a[r][c];
    	
    	return matran(T);
    }
    
    // Phep nhan ma tran
    matran matran::operator *(const matran &A)
    {
    	matran T(row, A.col);
    
    	for( int r = 0; r < T.row; r++ )
    	{
    		for( int c = 0; c < T.col; c++ )
    		{
    			T.a[r][c] = 0.0;
    			for( int i = 0; i < col; i++ )
    			{
    				T.a[r][c] += a[r][i] * A.a[i][c];
    			}
    		}
    	}
    
    	return matran(T);
    }
    
    // Nhan ma tran voi mot so thuc
    matran matran::operator *(const double value)
    {
    	matran T(row, col);
    	for( int r = 0; r < row; r++ )
    		for( int c = 0; c < col; c++ )
    			T.a[r][c] = value * a[r][c];
    
    	return matran(T);
    
    }
    
    // nhan mot so voi mot ma tran
    matran operator *(double value, const matran&A)
    {
    	matran T(A.row, A.col);
    	for( int r = 0; r < A.row; r++ )
    		for( int c = 0; c < A.col; c++ )
    			T.a[r][c] = value * A.a[r][c];
    		
    	return matran(T);
    
    }
    
    // Chia ma tran cho mot so thuc
    matran matran::operator /(const double value)
    {
    	matran T(row, col);
    	for( int r = 0; r < row; r++ )
    		for( int c = 0; c < col; c++ )
    			T.a[r][c] =  a[r][c]/ value;
    
    	return matran(T);
    }
    Còn đây là hàm main em dùng để chạy thử chương trình
    Code:
    #include <iostream>
    #include<iostream>
    #include<iomanip>
    #include<conio.h>
    #include<windows.h>
    
    using std::cout ;
    using std::cin;
    using std::istream ;
    using std::ostream ;
    using std::setw;
    using std::endl;
    #include "matran.h"
    void main()
    {
    	char c='N';
    	matran p,q,s,kq2;
    	do
    	{
    		system("cls");
    		cout<<"\n nhap ma tran p:"; cin>>p;
    		cout<<" \n nhap ma tran q:"; cin>>q;
    		cout<<"\n nhap ma tran s:"; cin>>s;
    		cout<< p <<endl;
    		cout<< q <<endl;
    		cout<< s <<endl;
    
    		kq2=(q+p)-s;
    		cout<<"\n ket qua "<<(p+q)-s<<endl;
    		cout<<"\n ket qua"<<(p+q)+s<<endl;
    		cout<<"\n ket qua"<<s*(p+q)<<endl;
    		cout<<"\n Press 'Y' to continue or any other key to stop";
    		c=getch();
    	}while (c=='y'||c=='Y');
    }

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Ở toán tử " >> " bạn có cấp vùng nhớ cho object đâu @@, lấy gì mà chạy vòng for để nhập phần tử :(
    Um Mani Padme Hum...!!

  3. #3
    Ngày gia nhập
    11 2010
    Bài viết
    24

    Trích dẫn Nguyên bản được gửi bởi clchicken Xem bài viết
    Ở toán tử " >> " bạn có cấp vùng nhớ cho object đâu @@, lấy gì mà chạy vòng for để nhập phần tử :(
    Theo em hiểu thì ta đã cấp phát vùng nhớ cho nó khi khai báo lớp ma trận rồi nên ở toán tử nhập chỉ cần khai báo nhập vào chứ không cần phải khai báo cấp phát bộ nhớ cho nó nữa.em mới học nên cũng chưa được rõ vấn đề này lắm mong các bác chỉ giáo cho em với.
    Vậy theo bác clchicken thì cần khai báo thế nào chương trình mới có thể chạy được?

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    552

    @ bạn thân mến
    C++ Code:
    1. //ở main
    2.     matran p,q,s,kq2;
    Với khai báo như này thì theo bạn các object p ,q,s,kq2 sẽ được khởi tạo bởi constructor nào trong số các constructor bạn định nghĩa ??
    Và với constructor đấy thì Attribute **a của các object đấy đã dc khởi tạo vùng nhớ chưa
    Um Mani Padme Hum...!!

  5. #5
    Ngày gia nhập
    11 2010
    Bài viết
    24

    Lúc đầu em nghĩ là nó được khởi tạo bởi cái hàm này
    matran(const int rowsize, const int colsize)
    Nhưng sau khi thấy bác chỉ ra em đã hơi hiểu ra được vấn đề.
    Tuy nhiên em vẫn chưa rõ cách cấp phát cho ma trận ở chỗ này,bác có thể giúp em với được không ạ.

  6. #6
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Mặc định Cấp phát động bộ nhớ gặp lỗi không nhập được giá trị cho ma trận trong C++.

    Bạn khoan hãy nghĩ gì về class cliec đã nhé Tạm thời quên nó đi.
    Trở lại thời Lập trình hướng thủ tục một thời quen thuộc:
    Cách cấp phát vùng nhớ cho con trỏ thế nào, gán ra làm sao Nguyên lý thế nào, vì sao phải vậy ? . Đặc biệt cấp phát vùng cho con trỏ 2,3... chiều (con trỏ lồng con trỏ) thế nào

    Rồi nhìn lại vấn đề của bạn .
    Mỗi Object của bạn mang trong nó cái Att là 1 con trỏ double **a // Tức là trong tương lai nó chính là cái mảng 2 chiều để biểu diễn ma trận đây .
    Vậy dù gì thì dù, để làm việc với con trỏ a nói riêng hay Object matran nói chung thì đều phải cấp vùng nhớ cho nó đã rồi hãy tính đến chuyện xử lý tiếp theo gì trên nó

    Gợi ý cho bạn nè
    Nhờ có cái constructor matran(const int rowsize, const int colsize) // may quá
    Thêm vào đó ở trong toán tử ">>" với matran &x bạn khai báo kiểu tham chiếu (Ô, quá khỏe ).
    Sau khi bạn nhập dc col và row vào rồi, thì hãy dùng cái constructor đấy để Khởi tạo vùng nhớ cho a của x (x = new matran(row,col); )
    Rùi sau đó nhập tiếp các giá trị của ma trận
    Oke

    Tuy nhiên cái constructor này bạn viết chưa dc hay lắm .Cùng 1 số method khác nữa .
    Tạm thời bạn giải quyết cho code chạy được đã , rồi có time hãy tìm cách chuẩn hóa chúng là ok
    Đã được chỉnh sửa lần cuối bởi clchicken : 23-11-2011 lúc 09:51 PM.
    Um Mani Padme Hum...!!

  7. #7
    Ngày gia nhập
    11 2010
    Bài viết
    24

    Cảm ơn bác rất nhiều.Em sẽ nghiên cứu kỹ hơn nữa về phần này rồi sau đó sẽ tiếp tục hỏi bác tiếp nhé

  8. #8
    Ngày gia nhập
    11 2010
    Bài viết
    24

    Hic hic.Tình hình là em đã làm như hướng dẫ của bác nhưng nó vẫn báo lỗi y nguyên như lúc đầu.Không hiểu sai ở đâu nữa bác ạ.

  9. #9
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Operator >> của bạn thế nào post lên lại mình xem với
    Trong lúc đang chờ hàm tạo thì trong operator >> , ta sử dụng x.a=new double[row*col]; coi ra sao đã nhé
    Um Mani Padme Hum...!!

  10. #10
    Ngày gia nhập
    11 2010
    Bài viết
    24

    Code:
    istream& operator>>(istream& is,matran& x)
    {
    	cout<<"\nNhap vao so hang cua ma tran:";
    	is>>x.row;
    	cout<<"\nNhap vao so cot cua ma tran ";
    	is>>x.col;
    	x = new matran(x.row,x.col);
    	cout<<"Nhap cac phan tu cua ma tran : \n";
    	for(int i=1;i<=x.row;++i)
    		for(int j=1;j<=x.col;++j)
    		{
    			cout<<"a["<<i<<" , "<<j<<"]=";
    			is>>x.a[i][j];
    		}
    		return is;
    
    }
    Đây bác,bác xem hộ lại em lỗi chỗ nào cái

Các đề tài tương tự

  1. Kỹ thuật C++ Tìm 2 đỉnh xa nhau nhất trong đồ thị (ma trận kề)
    Gửi bởi toongteeng trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 14-04-2012, 10:58 PM
  2. Bài tập C Về cách nhập và sửa một ma trận trong lập trình?
    Gửi bởi tictic trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 09-11-2010, 12:11 AM
  3. Kỹ thuật C++ không nhập được khoảng trắng trong tập tin
    Gửi bởi cafelanh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 28-05-2010, 11:56 AM
  4. Tìm hàng có tổng nhỏ nhất trong ma trận
    Gửi bởi anhtuan90 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 22-04-2010, 10:53 PM
  5. Tìm số nguyên tố lớn nhất trong ma trận
    Gửi bởi phuha1806 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 27-03-2009, 10:06 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn