Thêm dòng trong ma trận bằng con trỏ

Giúp e sửa lỗi này với ạ !!!
Em viết hàm thêm dòng trong ma trận bằng con trỏ cấp 2. Thấy không có gì sai nhưng lại không chạy được. Mong các bác giúp đỡ.
Đây là code của em :

void ThemDong(int**& a, int& m, int n, int vitrithem)
{
	m++;
	a = (int**)realloc(a, m * sizeof(int*));
	for (int i = m - 1 ; i > vitrithem; i--)
	{
		for (int j = 0; j < n; j++)
		{
			a[i][j] = a[i - 1][j];
		//	*(*(a + i) + j) = *(*(a + i - 1) + j);
		}
	}

	for (int i = 0; i < n; i++)
	{
		cout << "Nhap a[" << vitrithem << "][" << i << "] : ";
		cin >> a[vitrithem][i];
	}
}

Source code : http://codepad.org/2FsQGtao


m > n hay n> m thì đều ra lỗi này bạn.

Bạn đã tạo mới mảng a và sau đó truy xuất đến những phần tử (con trỏ) có giá trị NULL. :smiling_imp:

3 Likes

Anh có thể sửa lại giúp e đc không ạ, em mới học con trỏ nên cũng chưa rành lắm :frowning:

Mình nhầm lẫn tí, bạn dùng realoc() nên chỉ có phần tử cuối cùng bị NULL thôi.

Bạn không cần phải dùng vòng lặp lồng thứ 2 (for( int j...). Chỉ cần gán trực tiếp trong vòng lặp 1 thôi. a[i] = a[i - 1] là xong!

3 Likes

Mình cảm ơn bạn nhiều nha, để mình sửa lại thử

Mà quên nữa. Tại dòng bạn muốn thêm (vitrithem) bạn phải khởi tạo mới các phần tử của dòng, tức là dùng maloc() hoặc new.

3 Likes

Mình xin góp ý về code của bạn trong codepad

  1. Về cách đặt tên biến: thay vì đặt số dòng là m, số cột là n, khá tối nghĩa và có thể gây nhầm lẫn (một số người, sách, đề bài, … lại thích đặt ngược lại là số dòng là n, số cột là m), thì bạn nên đặt nó là dc, hoặc dongcot, hoặc rc, hoặc rowcolumn.

  2. Về hàm ThuHoi:
    a. thay delete a[i] thành delete[] a[i], bởi vì a[i] ở đây được xem là một mảng một chiều, nên nếu bạn viết delete a[i] thì nó chỉ xoá quyền quản lý của chỉ a[i][0].
    b. Gán m = n = 0: cái này để cho nó dễ kiểm tra xem mảng có rỗng hay không.
    c. Gán a = nullptr: sau lệnh delete thì con trỏ vẫn còn trỏ đến địa chỉ đó, vì vậy để cho nó “chia tay nyc” một cách dứt khoát thì nên gán bằng con trỏ null.

  3. Về hàm NhapMaTranXuatMaTran: Bạn không nên dùng cách duyệt mảng hai chiều 1 biến chạy, bởi vì khi mn lớn thì m * n còn lớn hơn nữa, và nó có thể vượt qua giới hạn của kiểu int (nói đúng hơn là kiểu mà bạn khai báo cho mn). Và cách này cũng không giúp code chạy nhanh hơn, vì mất cái này được cái kia (bỏ biến chạy thứ hai, đổi lại chỉ số của các phần tử phải thông qua phép toán:i / n, i % n). Vậy tại sao ta lại không dùng cách duyệt mảng hai chiều 2 biến chạy ?

  4. Về các hàm XoaDong, XoaCot, ThemDong, ThemCot: bạn nên tạo ràng buộc đối với vị trí cần xoá/thêm, nếu không các hàm này sẽ bị lỗi, ví dụ với m = 2, vitri = 10, thì hàm XoaDong, xoá đi mất 1 dòng, mặc dù mảng không có dòng 10.

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