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

Đề tài: cấp phát bộ nhớ bên Heap

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

    Mặc định cấp phát bộ nhớ bên Heap

    C++ Code:
    1. #include <iostream.h>
    2.  
    3. class A{
    4. public:
    5.        A():val(0){cout<< "default constructor"<< endl;}
    6.        A(int a):val(a){cout<< "set constructor"<< endl;}      
    7.        ~A(){cout<< "destructor"<< endl;}
    8.      
    9.         int getVal()const {return val;}
    10.         void setVal(int a){val= a;}
    11. private:
    12.         int val; double temp; //size of A is 16 bytes    
    13. };      
    14.  
    15. int main(){
    16.     A**  cc= (A**)(new A[3][2]);
    17.     cout<< &cc<< " - "<< cc<< " - "<< *cc<< " - "<< **cc<< endl;
    18.     for(int i= 0; i< 3; i++)
    19.           for(int j= 0; j< 2; j++) (*(cc+ i)+ j)->getVal();
    20.                                         //or cc[i][j].getVal()
    21.    return 0;
    22. }

    mình dùng Dev-C++
    đối với mảng 1 chiều thì không có gì xảy ra
    đối với mảng 2 chiều thì lỗi thực thi ở vòng for (lỗi truy cập mảng)
    mảng 2 chiều được cấp phát bộ nhớ bên Heap không giống bên Stack, lệnh cout cho thấy các phần tử mảng này không theo thứ tự như bên Stack. Mình nhận xét vậy có đúng không?
    làm cách nào sửa lỗi chương trình trên?
    A** cc= new A[3][2];//error, don't convert A(*)[2] to A**
    vậy A(*)[2] là kiểu gì? làm cách nào để tiếp nhận và điều khiển nó từ bên Stack? Nếu buộc phải cấp phát biến cc mới bên Heap để tiếp nhận kết quả new trả về, thì làm cách nào khai báo cc và sử dụng?
    mong giải thích thêm về việc cấp phát bộ nhớ bên Heap?
    rất mong mọi người giúp đỡ! cám ơn luôn nha.
    Đã được chỉnh sửa lần cuối bởi ooze : 01-03-2008 lúc 01:25 AM.

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

    Đây cậu, cậu viết kiểu chế đó không xong đâu, phải hiểu bản chất, compiler cho cậu cái message đó dễ hiểu mà , đọc lại coi sao :
    C++ Code:
    1. #include <iostream.h>
    2.  
    3. class A{
    4. public:
    5.   A():val(0){
    6.     cout<< "default constructor"<< endl;
    7.   }
    8.   A(int a):val(a){
    9.     cout<< "set constructor"<< endl;
    10.   }
    11.   ~A(){cout<< "destructor"<< endl;}
    12.  
    13.   int getVal()const {return val;}
    14.   void setVal(int a){val= a;}
    15. private:
    16.   int val;
    17.   double temp; //size of A is 16 bytes
    18. };
    19.  
    20. int main(){
    21.  
    22.   A **ptr_to_ptr = new A*[3];
    23.  
    24.   for(int x = 0; x < 3; ++x){
    25.     ptr_to_ptr[x] = new A[2];
    26.   }
    27.  
    28.   for(int x = 0; x < 3; ++x){
    29.     delete[] ptr_to_ptr[x];
    30.   }
    31.  
    32.   delete [] ptr_to_ptr;
    33.  
    34.   return 0;
    35. }
    36. }
    Bộ nhớ trên heap thì cũng đơn giản thôi, hiểu con trỏ thì nó cũng y chang con trỏ vậy.

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

    cám ơn bạn nhiều lám!
    cái bạn giúp mình là
    A **ptr_to_ptr = new A*[3];//mảng con trỏ, sau dó mỗi con trỏ lại trỏ tiếp đến mảng 1 chiều khác bên Heap. Cũng là 1 cách để tạo mảng 2 chiều (không trực tiếp) bên Heap.
    còn cái mình hỏi là
    A** cc= new A[3][2];//error, don't convert A(*)[2] to A** //mảng 2 chiều (trực tiếp) bên Heap
    mình ép kiểu thành
    A** cc= (A**)(new A[3][2]);//ok
    để không báo lỗi
    Ý mình hỏi là làm cách nào để tạo mảng 2 chiều bên Heap như bên Stack? Đồng ý là cách bạn giới thiệu cũng hay lám, nhưng tốn thêm bộ nhớ cho các con trỏ trỏ đến mỗi mảng con khác (tất nhiên là các mảng con này không "nối đuôi" nhau bên trong Heap). Bạn giúp dùm lần nữa nha.
    bên Stack: A cc[3][2];//các phần tử liền nhau trong Stack
    bên Heap: new A*[2];//các phần tử chưa liền nhau trong Heap
    cái mình cần: new A[3][2];//rồi gửi 0xabcdef đầu mảng về bên Stack điều khiển nó. Mình ép kiểu thì ok rồi, nhưng khi truy cập thì báo lỗi, và kiểm tra thử địa chỉ các phần tử bên Heap có vẻ không liền nhau.
    chịu khó giúp mình tí nữa ha.
    Đã được chỉnh sửa lần cuối bởi ooze : 01-03-2008 lúc 07:45 PM.

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

    C++ Code:
    1. class A{
    2. public:
    3.        A():val(7),temp(8.9){cout<< "default constructor"<< endl;}
    4.        A(int a):val(a){cout<< "set constructor"<< endl;}      
    5.        ~A(){cout<< "destructor"<< endl;}
    6.      
    7.         int getVal()const {return val;}
    8.         void setVal(int a){val= a;}
    9.        
    10.         double getTemp()const {return temp;}
    11.         void setTemp(double a) {temp= a;}
    12. private:
    13.         int val; double temp; //size of A is 16 bytes    
    14. };
    15.  
    16. int main(){
    17.   #define m 3
    18.   #define n 2
    19.   A** cc= (A**)new A[m][n];//call default constructor
    20.   for(int i= 0; i< m*n; i++)
    21.     cout<< ((A*)cc+ i)->getVal()<< " - "
    22.           << ((A*)cc+ i)->getTemp()<< " - "
    23.           << (A*)cc+ i<< endl;//print true value
    24.   //==>Heap cấp phát mảng 2 chiều "nối đuôi" nhau như bên Stack
    25.    
    26.   cout<< ((A*)cc+ 6)->getVal()<< " - "
    27.         << ((A*)cc+ 6)->getTemp()<< " - "
    28.         << (A*)cc+ 6<< endl;//print wrong value
    29.   return 0;
    30. }

    bạn nào có kinh nghiệm thì chỉ giúp mình cách truy cập mảng bằng 2 chỉ số (index) như bên Stack dùm (truy cập mảng bằng 2 chỉ số như bài viết đầu tiên của mình thì bị lỗi tính toán số học của con trỏ, nên truy cập sai vùng nhớ của mỗi đối tượng). Chịu khó suy nghĩ công thức tính địa chỉ thì cũng có thể được kết quả mong muốn, nhưng thiên về kỷ thuật toán học quá. Bạn nào xử lý khéo chổ này thì ra tay giúp dùm đi. Chứ ép kiểu qua, rồi ép kiểu lại cũng mỏi tay quá hà.
    Làm ơn làm phước dùm ha... đầu năm mới mà.
    Đã được chỉnh sửa lần cuối bởi ooze : 01-03-2008 lúc 10:23 PM.

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

    C++ Code:
    1. #include <iostream.h>
    2.  
    3. class A{
    4. public:
    5.   A():val(0){
    6.     cout<< "default constructor"<< endl;
    7.   }
    8.   A(int a):val(a){
    9.     cout<< "set constructor"<< endl;
    10.   }
    11.   ~A(){cout<< "destructor"<< endl;}
    12.  
    13.   int getVal()const {return val;}
    14.   void setVal(int a){val= a;}
    15. private:
    16.   int val;
    17.   double temp; //size of A is 16 bytes
    18. };
    19.  
    20. int main(){
    21.  
    22.   A stackArrd[2][3];
    23.  
    24.   for(int x = 0; x < 2; ++x)
    25.   {
    26.     for(int y = 0; y < 3; ++y){
    27.       stackArrd[x][y].setVal(1);
    28.     }
    29.   }
    30.  
    31.   for(int x = 0; x < 2; ++x)
    32.   {
    33.     for(int y = 0; y < 3; ++y){
    34.       std::cout << stackArrd[x][y].getVal();
    35.     }
    36.   }
    37.   return 0;
    38. }
    Chẳng hiểu cậu muốn cái gì, đừng cố làm phức tạp nữa !
    Đã được chỉnh sửa lần cuối bởi rox_rook : 02-03-2008 lúc 01:23 AM.

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

    Mặc định cấp phát bộ nhớ bên Heap

    khả năng truyền đạt của mình còn kém quá, bạn vẫn chưa hiểu ý mình.
    bầy giờ bạn hãy chỉ mình cách đem mảng 2 chiều (không phải mảng con trỏ 1 chiều) trong bài viết số 2 của bạn qua Heap đi. Thay vì tạo bên Stack, bây giờ bạn tạo bên Heap đi.
    Hy vọng bạn đã hiểu ý mình. Bạn giúp thêm lần cuối về vấn đề này ha.
    Không thấy anh/chị nào tham gia vào hết, chắc có lẻ xài bên Stack là quá đủ hay sao ấy...hihi.
    Cám ơn bạn cố gắng giúp đỡ.

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

    C++ Code:
    1. #include <iostream.h>
    2.  
    3. class A{
    4. public:
    5.        A():val(0){cout<< "default constructor"<< endl;}
    6.        A(int a):val(a){cout<< "set constructor"<< endl;}      
    7.        ~A(){cout<< "destructor"<< endl;}
    8.      
    9.         int getVal()const {return val;}
    10.         void setVal(int a){val= a;}
    11. private:
    12.         int val; double temp; //size of A is 16 bytes    
    13. };      
    14.  
    15. int main(){
    16.     #define m 3
    17.     #define n 2
    18.     A**  cc= (A**)new A[m][n];//6 default constructor
    19.     //for(int i= 0; i< m; i++)
    20.     //      for(int j= 0; j< n; j++) cc[i][j].setVal(i+j);//error
    21.     for(int i= 0; i< m; i++)
    22.        for(int j= 0; j< n; j++)
    23.           ((A*)(((int)cc+ i* sizeof(A[n]))+ j* sizeof(A)))->setVal(i+j);
    24.     for(int i= 0; i< m; i++)
    25.        for(int j= 0; j< n; j++)
    26.           cout<< ((A*)(((int)cc+ i* sizeof(A[n]))+ j* sizeof(A)))->getVal()
    27.                 << endl;
    28.    return 0;
    29. }
    mảng 2 chiều bên Heap

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

    Không phải tui làm khó cậu nhưng cho mình hỏi cậu 1 câu, cậu làm vậy để làm gì ? Bạn post thử project bạn đang làm lên thì tui mới nói được, bạn xem rõ ràng cái đoạn code bạn mới post ( tui chưa có thời gian đọc ) nhưng rõ ràng code trở nên quá phức tạp, mà viết như thế thì chẳng có hiệu quả gì, nếu có bug thì chỉ có mà làm lại từ đầu. Còn stack hay heap thì chỉ khác nhau chỗ run-time ( cái này theo tui nghĩ thôi ).
    Còn câu này :
    bầy giờ bạn hãy chỉ mình cách đem mảng 2 chiều (không phải mảng con trỏ 1 chiều) trong bài viết số 2 của bạn qua Heap đi.
    Câu này tui thực sự không hiểu 1 chút nào, để tui đọc kĩ lại rùi suy nghĩ đã !

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

    Sau 1 hồi đọc tới đọc lui thì đã hiểu ý cậu, có điều cậu hiểu sai rùi, đọc lại cái bài cấp phát mãng 2 trên heap là cái bạn cần, còn cái code của cậu là non-logic. Hint : Tui hỏi cậu 1 câu : mãng 2 theo cậu nó đc lưu thế nào trong bộ nhớ ? Trả lời xong thì bạn hiểu luôn rùi đó !

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

    Code:
    #include <iostream.h>
    
    class A{
    public:
           A():val(0){cout<< "default constructor"<< endl;}
           A(int a):val(a){cout<< "set constructor"<< endl;}       
           ~A(){cout<< "destructor"<< endl;}
          
            int getVal()const {return val;} 
            void setVal(int a){val= a;}
    private:
            int val;
    };
    
    int main(){
        A (*cc)[2]= new A[3][2];
        for(int i= 0; i< 3; i++)
              for(int j= 0; j< 2; j++) cout<< cc[i][j].getVal();
        return 0;
    }
    cái mình cần nè, hihi đơn giản thế mà làm bực mình mấy ngày nay. Tự làm khó bản thân rồi lại nhờ mọi người giúp.
    cám ơn rox_rook he.

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

  1. Giúp mình kích danh mục bên trái, nó load url vào khung bên phải
    Gửi bởi jockthree trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 26-09-2013, 11:50 AM
  2. Hỏi về lý thuyết Min-Max Heap
    Gửi bởi mikgnort trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 20-12-2011, 09:26 PM
  3. Sự khác nhau của Heap Size và Array Length của mảng tạo thành Heap
    Gửi bởi cutithongtin trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 05-01-2011, 04:35 PM
  4. Xử lý đa luồng? (Heap sỏt)
    Gửi bởi exdragonk trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 11
    Bài viết cuối: 28-09-2009, 11:18 AM

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