Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Thao tác trên mảng 2 chiều bằng con trỏ

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    78

    Mặc định Thao tác trên mảng 2 chiều bằng con trỏ

    - Tớ biết đây là đoạn chương trình C nhưng post qua bên C++ là sai luật.Nhưng bài này mình khai báo cấp phát động bằng new, delete nên phải post vào đây mới phản ánh được vấn đề...Còn code chỉ là hình thức thôi mong các mod bỏ qua!
    => Vào vấn đề chính:

    - Mình có đọc một số bài viết về cấp phát mảng 2 và thao tác với nó nhưng có một số thắc mắc sau:
    + Có dịp đọc bài thì Rox_Rook nói rằng
    * phải khai báo static khi cấp phát thì ra khỏi hàm thì con trỏ trỏ vào mảng mới ko bị mất
    * đồng thời trong C++ dùng new cái nào thì phải delete cái đó nó mới chịu

    ???Nhưng mà tớ có code thử đoạn chương trình sau thì bị lỗi ở phần delete trong hàm xuatmatran() mong các bạn xem và sửa dùm mình?Có thể nói cho mình biết tại sao nhé?Cảm ơn nhiều. Using VC++ 6.0

    C++ Code:
    1. #include <stdio.h>
    2.  
    3. int **nhapmatran(int **A, int n)
    4. {
    5.     static int **p = A;
    6.     p = new int *[n];
    7.     for(int k=0;k<n;k++)
    8.     {
    9.         p[k] = new int [n];
    10.     }
    11.  
    12.     for(int i=0;i<n;i++)
    13.     {
    14.         for(int j=0;j<n;j++)
    15.         {
    16.             printf("Nhap A[%d][%d] ",i,j);
    17.             scanf("%d",&p[i][j]);
    18.         }
    19.     }
    20.     return(p);
    21. }
    22.  
    23. int **xuatmatran(int **A, int n)
    24. {
    25.     int **p = A;
    26.     for(int i=0;i<n;i++)
    27.     {
    28.         for(int j=0;j<n;j++)
    29.         {
    30.             printf("%d ",p[i][j]);
    31.         }
    32.         printf("\n");
    33.     }
    34.  
    35.     delete [] p[n]; //error is here
    36.     for(int k=0;k<n;k++)   // tớ cớ sữa lại :thay thế
    37.         {                            // p bằng A nhưng vẫn bị error
    38.         delete [] p[k];
    39.     }
    40.     return(p);
    41. }
    42.  
    43. void main()
    44. {
    45.     static int **ArrP;
    46.     int N=3;
    47.     ArrP = nhapmatran(ArrP,N);
    48.     ArrP = xuatmatran(ArrP,N);
    49. }
    No way, No success..

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà Nội
    Bài viết
    138

    Bạn sử dụng thư viện stdio.h của C, làm gì có new và delete chứ? new và delete là hàm cấp phát và thu hồi bộ nhớ của C++ mà?

    Trong hàm xuất ma trận bạn khai báo int **p = A; điều này nó sẽ cấp phát thêm một con trỏ **p local xử lý bên trong hàm xuất ma trận, chứ chẳng liên quan gì đến cái static cả. Bạn đọc lại tài liệu về vấn đề này đi.

    Regards!
    Tất cả các câu hỏi của thành viên (không vi phạm luật lệ tham gia) gửi vào box Java, Linux nếu không thành viên nào trả lời hỗ trợ trong vòng 24h, ban quản trị sẽ trực tiếp hỗ trợ. Các bạn giới thiệu và loan tin giúp điều này

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Bạn sử dụng thư viện stdio.h của C, làm gì có new và delete chứ? new và delete là hàm cấp phát và thu hồi bộ nhớ của C++ mà?
    new và delete là toán tử, làm gì liên quan đến thư viện nào vậy Dr. Nó chỉ cần compiler của C++ là đủ rùi. (kết quả của việc yêu đuơng quá nhiều ) r2 : 1 vs Dr : 0.
    Còn cậu mubaohiem thì hiểu nhầm 1 tí, tui đưa 2 ví dụ tui nghĩ cậu sẽ hiểu ra .
    new & delete
    C++ Code:
    1. #include <cstdio>
    2.  
    3. char** give_me_arr2D(unsigned size){
    4.     char** new2D = new char*[size];
    5.     for(unsigned x = 0; x < size; ++x){
    6.         new2D[x] = new char[size];
    7.     }
    8.  
    9.     for(unsigned x = 0; x < size; ++x){
    10.         for(unsigned y = 0; y < size; ++y){
    11.             new2D[x][y] = 'x';
    12.         }
    13.     }
    14.     return new2D;
    15. }
    16.  
    17. void print_arry(char** arr2D, unsigned size){
    18.     for(unsigned x = 0; x < size; ++x){
    19.         for(unsigned y = 0; y < size; ++y){
    20.             printf("%c", arr2D[x][y]);
    21.         }
    22.         printf("\n");
    23.     }
    24. }
    25. int main(){
    26.     char** arry;
    27.     arry = give_me_arr2D(5);
    28.     print_arry(arry, 5);
    29.  
    30.     for(unsigned x = 0; x < 5; ++x)
    31.         delete[] arry[x];
    32.    
    33.     delete[] arry;
    34. }

    static
    C++ Code:
    1. #include <cstdio>
    2.  
    3. const int size = 5;
    4.  
    5. char** give_me_arr2D(){
    6.     static char static2D[size][size];
    7.     char** return_value = reinterpret_cast<char** >(&static2D[size]);
    8.     for(int x = 0; x < size; ++x){
    9.         return_value[x] = static2D[x];
    10.     }
    11.  
    12.     for(unsigned x = 0; x < size; ++x){
    13.         for(unsigned y = 0; y < size; ++y){
    14.             return_value[x][y] = 'x';
    15.         }
    16.     }
    17.     return return_value;
    18. }
    19.  
    20. void print_arry(char** arr2D){
    21.     for(unsigned x = 0; x < size; ++x){
    22.         for(unsigned y = 0; y < size; ++y){
    23.             printf("%c", arr2D[x][y]);
    24.         }
    25.         printf("\n");
    26.     }
    27. }
    28. int main(){
    29.     char** arry;
    30.     arry = give_me_arr2D();
    31.     print_arry(arry);
    32. }
    Đã được chỉnh sửa lần cuối bởi rox_rook : 03-04-2008 lúc 03:25 AM.

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - Nếu ta khai báo mãng là static thì khi ra khỏi hàm nó không còn mang ý nghĩa là local variable nữa, nó tồn tại cho đến khi chương trình kết thúc.
    - Ngược lại nếu ta dùng new thì ta sẽ tạo ra 1 vùng nhớ trên heap, và vùng nhớ này sẽ tồn tại mãi cho đến chừng nào ta gọi delete, đó là vì sao đôi khi người ta nói quên delete[] sẽ dấn đến memory leak.
    - Tui sẽ cho cậu 1 ví dụ về mãng 1 chiều, có lẽ sẽ dễ hiểu hơn.
    static
    C++ Code:
    1. #include <cstdio>
    2.  
    3. const int size = 5;
    4.  
    5. char* give_oneD(){
    6.     static char arr[size]; //thằng này sẽ không bị destroy như biến local.
    7.     char* q = arr;
    8.     for(unsigned x = 0; x < size; ++x){
    9.             q[x] = 'x';
    10.     }
    11.     return q;
    12. }
    13.  
    14. void print_it(char* arr){
    15.     for(int x = 0; x < size; ++x){
    16.         printf("%c", arr[x]);
    17.     }
    18. }
    19.  
    20. int main(){
    21.     char* my_arr;
    22.     my_arr = give_oneD();
    23.     print_it(my_arr);
    24. }
    new-delete
    C++ Code:
    1. #include <cstdio>
    2.  
    3. const int size = 5;
    4.  
    5. char* give_oneD(){
    6.     char *arr = new char[size];
    7.     char* q = arr;
    8.     for(unsigned x = 0; x < size; ++x){
    9.             q[x] = 'x';
    10.     }
    11.     return q;
    12. }
    13.  
    14. void print_it(char* arr){
    15.     for(int x = 0; x < size; ++x){
    16.         printf("%c", arr[x]);
    17.     }
    18. }
    19.  
    20. int main(){
    21.     char* my_arr;
    22.     my_arr = give_oneD();
    23.     print_it(my_arr);
    24.  
    25.     delete[] my_arr; //chừng nào thằng này được gọi thì vùng nhớ đó mới được giải phóng.
    26. }

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    delete [] p[n]; //error is here
    for(int k=0;k<n;k++) // tớ cớ sữa lại :thay thế
    { // p bằng A nhưng vẫn bị error
    delete [] p[k];
    }
    return(p);
    //
    Cậu làm ngược lại thì ok
    R2 càng ngày càng tiến bộ. Hâm mộ thật.
    À mà tớ hỏi cái này nhé :
    " Ngược lại nếu ta dùng new thì ta sẽ tạo ra 1 vùng nhớ trên heap, và vùng nhớ này sẽ tồn tại mãi cho đến chừng nào ta gọi delete, đó là vì sao đôi khi người ta nói quên delete[] sẽ dấn đến memory leak."

    Thế nếu như thế này :
    void test()
    { int *p = new int[n]; }
    void main()
    { test(); getch(); }
    Thì đã giải phóng vùng nhớ chứa trên heap chưa ?

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

  1. Lập trình C Đề tài: mảng và các thao tác trên mảng 2 chiều: tìm kiếm.........
    Gửi bởi quanvovan trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 15-11-2012, 11:13 PM
  2. cấp phát bộ nhớ động cho mảng 2 chiều trên C như thế nào?
    Gửi bởi mat_mot_mua_hoa trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 20-07-2012, 05:39 PM
  3. Chia m phần thưởng cho n người trên C++ như thế nào?
    Gửi bởi doc_bo_hanh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 12-10-2010, 09:18 PM
  4. Tính a mũ n bằng phương pháp chia để trị trên C như thế nào?
    Gửi bởi nhatnha trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 08-08-2010, 08:04 PM
  5. Các thao tác trên Đa thức | Cộng trừ nhân chia da thức
    Gửi bởi PoPoPoPo trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 28-03-2010, 10:09 PM

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