Lấy Giá Trị Của **a (cấp Phát động Mảng 2 Chiều) Trong C++? Trang chủ » Cấp Phát Mảng 2 Chiều Trong C++ » Lấy Giá Trị Của **a (cấp Phát động Mảng 2 Chiều) Trong C++? Có thể bạn quan tâm Cấp Phát Ppe Cấp Phát Thuốc Cho F0 Cấp Phê Duyệt Dtm Cấp Phê Duyệt Dự án đầu Tư Cấp Phê Duyệt Kế Hoạch đấu Thầu Lấy giá trị của **a (cấp phát động mảng 2 chiều) trong C++? programming pointers c++ copy-constructor hell6w9rld (HelloWorld) February 18, 2020, 5:31am #1 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; hell6w9rld (HelloWorld) October 9, 2016, 3:50pm #2 hiếp me? nicklauri (Khoa NTA) October 9, 2016, 3:54pm #3 Để 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 Vậy bạn coi ở đây tạm đi :3 1 Like hell6w9rld (HelloWorld) October 9, 2016, 3:57pm #4 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 nicklauri (Khoa NTA) October 9, 2016, 4:03pm #5 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à 1 Like hell6w9rld (HelloWorld) October 9, 2016, 4:16pm #6 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 Gio (Gió) October 9, 2016, 4:40pm #7 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 hell6w9rld (HelloWorld) October 9, 2016, 4:40pm #8 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ỏ hell6w9rld (HelloWorld) October 9, 2016, 4:42pm #9 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) hell6w9rld (HelloWorld) October 9, 2016, 4:47pm #10 mình định nghĩa lại toán tử = thì chạy ổn rôi, tks bạn nicklauri (Khoa NTA) October 9, 2016, 4:54pm #11 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 hell6w9rld (HelloWorld) October 10, 2016, 3:50am #12 aliston: Linus 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 nicklauri (Khoa NTA) October 11, 2016, 4:16am #13 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 rudinla (Trouble anywhere) October 5, 2022, 11:00pm #14 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 DayNhauHoc's Discord Học C++ Free? Click Blog Dạy Nhau Học Tự Học Lập Trình 83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao? Từ khóa » Cấp Phát Mảng 2 Chiều Trong C++ Cấp Phát động Cho Mảng Hai Chiều Trong C++ - Nguyễn Tuấn's Blog Con Trỏ Mảng 2 Chiều Trong C++ Bài 67. Cấp Phát động Mảng 2 Chiều Trong C - Lập Trình Không Khó C++ 35: Mảng Hai Chiều Cấp Phát động - YouTube Cách Cấp Phát Bộ Nhớ Cho Mảng động 2 Chiều? - Dạy Nhau Học Mảng 2 Chiều Trong C++ (Two-dimensional Arrays) | How Kteam Mảng Hai Chiều - Mảng Đa Chiều Trong C++ - CodeLearn Con Trỏ Và Cấp Phát động Trong C++ | TopDev Bài 67. Cấp Phát động Mảng 2 Chiều Trong C C++ 35: Mảng Hai Chiều Cấp Phát động | Chia Sẻ Về Chủ đề Mảng 2 ... Mảng Hai Chiều Trong C++ Và Truyền Mảng Vào Hàm. - Viblo Cấp Phát động Cho Mảng 2 Chiều Trên C. Giúp Mình Sửa Lỗi? Cấp Phát Bộ Nhớ động Cho Mảng Sử Dụng Con Trỏ Trong C Mảng 2 Chiều Trong C++