01/10/2018, 11:20

Giải thích cho e về bài tập cấp phát bộ nhớ động cho mảng 2 chiều với ạ

đề bài: Viết chương trình nhập vào 1 số n. Khởi tạo và nhập vào một mảng 2 chiều gồm n hàng và n cột. Tính tổng tất cả các số có trên đường chéo chính.
Yêu cầu sử dụng 2 hàm sau:
Prototype: void nhap(int **a, int n)//nhập mảng 2 chiều [nxn] do con trỏ a trỏ tới
int tong_cheo (int **a, int n)// trả về tổng các phần tử trên đường chéo chính
Lúc nhập giá trị các phân tử xong rồi thì nó bị lỗi ở dòng này ạ: s += ((a+i)+j);
và báo lỗi : Exception thrown at 0x013C618C in Project16.exe: 0xC0000005: Access violation reading location 0x00000000.
e tìm hiểu mãi không biết, nên mới đăng lên hỏi các ac, e cảm ơn ạ.

using namespace std;
void nhap(int **a, int n)
{
    a = new int *[n];
    for (int i = 0; i < n; i++) {
        a[i] = new int [n];
        for (int j = 0; j < n; j++)
        {
            cout << "A[" << i << "]" << "[" << j << "]= ";
            cin >> *(*(a+i)+j);
        }
    }
}
int tong_cheo(int **a, int n)
{
    int s = 0;
    int j = 0;
    for (int i = 0; i < n; i++)
    {
        s += *(*(a+i)+j);
    }
    return s;
}

int main()
{
    int **a=0;
    int n;
    cout << "Nhap gia tri cua n:"; cin >> n;
    nhap(a, n);
    cout << "Tong cac phan tu tren duong cheo chinh= " << tong_cheo(a,n);
    cout << endl;
    system("pause");
    return 0;
    for (int i = 0; i < n; i++)
        delete [] * (a + i);
    delete[] a;
}
Dark.Hades viết 13:25 ngày 01/10/2018

int j = 0;

Đường chéo thì tăng i là đc rồi không cần j nữa đâu.
Bạn xuất mảng sau khi nhập xem có ra kết quả không?

rogp10 viết 13:34 ngày 01/10/2018

Thôi, viết bt đi cho nó dễ đọc mà sai ngay chỗ hàm nhập rồi. Xem lại tham trị và tham biến (qua tham chiếu).

viết 13:30 ngày 01/10/2018
void nhap(int **&a, int n)

thêm 1 dấu & là xong

xóa luôn cái return 0; nữa

Khuyết Danh viết 13:33 ngày 01/10/2018

đoạn đó e thiếu j++; ở trong.
e bỏ j thì nó ra tổng các phần tử ở dòng đầu chứ k ra tổng đường chéo ạ

Khuyết Danh viết 13:34 ngày 01/10/2018

e cám ơn a ạ, e ra rồi.
a giải thích cho e 1 chút tại sao thêm dấu & được k ạ,

Khuyết Danh viết 13:36 ngày 01/10/2018

a giải thích cho e tí được k ạ?

HK boy viết 13:31 ngày 01/10/2018

tại sao thêm dấu &

Với void nhập dữ liệu vào 1 mảng a, bạn cần phải nạp 1 tham biến, vì việc nhập làm thay đổi nội dung của mảng. Mà tất nhiên là bạn muốn nhập dữ liệu cho mảng a đúng không? Thêm & để hàm biết rằng cần thay đổi nội dung của 1 mảng a đã có sẵn.

rogp10 viết 13:26 ngày 01/10/2018

Tham chiếu là một… đối tượng (first-class object) và có thể khai báo đại loại như: T &rf = tf; với đặc điểm buộc phải khởi tạo bằng đối tượng kiểu T và nó sẽ thay mặt cho đối tượng này (binding). Chính vì tính đại diện này mà thực hiện được việc truyền tham biến.

Khuyết Danh viết 13:29 ngày 01/10/2018

E cám ơn nhiều ạ

Bài liên quan
0