Lấy giá trị của **a (cấp phát động mảng 2 chiều) trong C++?

chào các bạn
mình có đoạn chương trình sau:
cấp phát động mảng 2 chiều, nhân 2 ma trận

#include <iostream>
using namespace std;

class matrix{
private:
	int **array;
	int h, c;

	void allocated(){
		array = new int *[h];
		for (int i = 0; i < h; i++){
			array[i] = new int[c];
		}
	}

public:
	matrix(){

	}

	matrix(const matrix &a){
		this->c = a.c;
		this->h = a.h;
		this->allocated();

		int temp;
		for (int i = 0; i < h; i++){
			for (int j = 0; j < c; j++){
				this->array[i][j] = a.array[i][j];
				/*temp = a.array[i][j];
				this->array[i][j] = temp;*/
			}
		}
	}

	~matrix(){
		for (int i = 0; i < h; i++){
			delete array[i];
		}
		delete array;
	}

	void input(){
		cout << "So hang  ";
		cin >> h;
		cout << "So cot ";
		cin >> c;

		allocated();

		for (int i = 0; i < h; i++){
			for (int j = 0; j < c; j++){
				cout << "Nhap a[" << i << "][" << j << "]  ";
				cin >> array[i][j];
			}
		}
	}

	void output(){
		for (int i = 0; i < h; i++){
			for (int j = 0; j < c; j++){
				cout << array[i][j] << "   ";
			}
			cout << endl;
		}
	}

	int getter_h(){
		return h;
	}

	int getter_c(){
		return c;
	}

	friend matrix operator*(matrix, matrix);

};


matrix operator*(matrix, matrix);

int main(){
	matrix a, b;
	a.input();
	b.input();
	cout << "Ma tran a da nhap" << endl;
	a.output();
	cout << "Ma tran b da nhap" << endl;
	b.output();

	if (a.getter_c() != b.getter_h()){
		cout << "khong the nhan 2 ma tran" << endl;
	}
	else{
		matrix c;
		c = a * b;
		cout << "Tich 2 ma tran" << endl;
		c.output();
	}
	system("pause");
	return 0;
}

matrix operator*(matrix a, matrix b){
	matrix temp;
	temp.h = a.h;
	temp.c = b.c;
	temp.allocated();

	for (int i = 0; i < a.h; i++){
		for (int j = 0; j < b.c; j++){
			temp.array[i][j] = 0;
			for (int k = 0; k < a.c; k++){
				temp.array[i][j] += a.array[i][k] * b.array[k][j];
			}
		}
	}
	return temp;
}

class có dữ liệu là con trỏ, khi nạp chồng toán tử nhân 2 ma trận, hàm nạp chồng trả về 1 đối tượng , chương trình có hàm destructor để giải phóng con trỏ, nên khi biến tạm chứa kết quả nhân ma trận bị hủy (hàm nạp chồng toán tử chạy xong) thì đối tượng trả về sau khi nhân cũng bị hủy, (hủy cái *array) -> lỗi
nên mình đã định nghĩa lại copy constructor
như sau

	matrix(const matrix &a){
		this->c = a.c;
		this->h = a.h;
		this->allocated();

		int temp;
		for (int i = 0; i < h; i++){
			for (int j = 0; j < c; j++){
				this->array[i][j] = a.array[i][j];
				/*temp = a.array[i][j];
				this->array[i][j] = temp;*/
			}
		}
	}

nhưng làm thế nào để lấy giá trị của phần tử [i][j] được biểu diễn bằng con trỏ **array nhỉ
kiểu như int *a, *b;
thì (sao b) = (sao a);
nhưng đây là con trỏ **a;

mình dùng 1 biến tạm để lấy giá trị rồi gán vào thì vẫn k được

temp = a.array[i][j];
this->array[i][j] = temp;

hiếp me? :slight_smile:

Để cho con trỏ trỏ đến con trỏ thì chỉ cần: int **a, *b; b = blablabla; *a = b; /* hoặc a=&b; */

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    int **a, *b, c;
    a = (int **) malloc(100);
    b = (int *) malloc(100);

    c = 69;
    b = &c;
    *(b + sizeof(int) + 1) = 996;

    // 2 cái đều cho ra kết quả giống nhau
    // *a = b;
    a = &b;

    printf("a[0][0] = %d\n", a[0][0]);
    printf("a[0][1] = %d\n", *(a[0] + sizeof(int) + 1));

    return 0;
}

Output:

a[0][0] = 69
a[0][1] = 996

Ví dụ chắc hơi khó hiểu ha :confused:
Vậy bạn coi ở đây tạm đi :3

1 Like

mình nhầm, ý mình là mình có 1 con trỏ **a
con trỏ a này dùng để trỏ đến 1 mảng con trỏ, mỗi con trỏ trỏ đến 1 mảng số nguyên
mình dùng nó cấp phát động cho mảng 2 chiều
và giờ để lấy giá trị của từng phần tử [i][j] trong mảng thì làm như thế nào, trong chương trình trên mình định nghĩa lại hàm copy constructor thì vẫn bị lỗi

Ugh… Mình không rành OOP C++ nên mình chịu. Mình chỉ lấy ví dụ ở C thôi :3 Nói chứ bạn đợi các pro khác đi, bài đăng chưa lâu mà :smiley:

1 Like

bạn dùng c mà k dùng c++ à?
mình đang làm nốt cái này để làm bao đóng truyền ứng :3

Vấn đề là lỗi ở chỗ matrix c ; c=a*b;
Vì bạn chưa overload operator = nên nó sẽ copy bộ nhớ từ matrix temp = (a*b) sang c; Lúc đó 2 thằng (temp và c) cùng giữ một ô nhớ nên hàm hủy ~matrix bị lỗi.
Cách đơn giản là dùng matrix c=a*b vì lúc này nó chỉ copy qua matrix(const matrix &a). Còn không bạn có thể overload lại operator =

2 Likes

mình quên mất, copy constructor cần được định nghĩa lại khi class có con trỏ, :3 quên mất toán tử = cũng cần nạp chồng khi class có con trỏ :1234:

thế cái khởi tạo sao chép của mình, có đúng k nhỉ

matrix(const matrix &a){
	this->c = a.c;
	this->h = a.h;
	this->allocated();

	int temp;
	for (int i = 0; i < h; i++){
		for (int j = 0; j < c; j++){
			this->array[i][j] = a.array[i][j];
			/*temp = a.array[i][j];
			this->array[i][j] = temp;*/
		}
	}
}

trên là mình dùng biến trung gian, vậy làm sao để lấy giá trị của phần tử [i][j] kiểu như int *a; (*a)

mình định nghĩa lại toán tử = thì chạy ổn rôi, tks bạn

Trường phái Linus/Linux :3 haha. Đùa thôi, tại hồi đó thấy OOP khó hiểu nên không quan tâm, mình chỉ quan tâm code thuần C và asm thôi. Nhưng giờ thời thế thay đổi, mình đã học thêm Python rồi là Java, sau đó là C++. Haha.
P/s: cũng khó hiểu là Linus rất ghét C++, không hiểu tại sao luôn :confused:

theo mình thấy học c++ rồi qua java dễ hơn, vì học từ c -> c++ dễ vì đã có nền tảng, python thì học c xong có thể học, na ná nhau

Mình cũng biết là vậy nhưng vì mình muốn thử sức với java (dễ tạo UI và cross platform nữa và vì mình làm biếng code, compile lại nên học java) :3

1 Like

Bạn cho mình xem lại code hoàn thiện được không ạ , mình đang làm bài tập cũng gặp chút khó hiểu chỗ này

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?