Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Cấp phát động trong C++ [đang nan giải]

  1. #1
    Ngày gia nhập
    09 2008
    Nơi ở
    Đà Nẵng
    Bài viết
    18

    Question Cấp phát động trong C++ [đang nan giải]

    Mình đang viêt chương trình sử dụng kiểu dữliệu skiplist. Mấy cái thuật toán chèn, xóa, tìm thì ko vấn đề gì nhưng cái trở ngại chính lại là cái initSkiplist(). Thế này :
    - Mình có một danh sach nhiều node, mỗi node có một số con trỏ để trỏ đến phần tử tiêp theo cũng kiểu node. Cac bạn lưu ý là mỗi node có số con trỏ next ko cố định và it nhât là 1. Mình thấy người ta hướng dẫn thì khi khai báo struct node, ngừoi ta tạo một mảng độ dài là 1 chứa con trỏ kiểu node thế này:

    Code:
    struct node{
         data  info;
         node *next[1]; //Sau này muốn mở rộng mảng này ra
    }
    Bây giờ cái hàm tạo node mới của mình cần tạo một node với số con trỏ next cho trươc, vậy làm sao để với kiểu khai báo như trên, chỉ dùng lệnh câp phat new mà mình có thể khai báo được một node trong đó có trường next là một mảng cac con trỏ kiểu node với độ dài mảng là do mình quy định. Mình cũng đã đọc source code của ng`ta nhưng thấy cach giải quyêt của họ là dùng malloc(), thực sự mình ko thich cái này nên đg nghiên cứu cach dùng new để tạo. Cac bạn xem lệnh của người ta nè :

    Code:
    void init( SkipList &list){
          if ((list.head =(NodeType *) malloc(sizeof(NodeType) + MAXLEVEL*sizeof(NodeType *))) == NULL){
                  printf(" loi cap phat!");
                  exit(EXIT_FAILURE);
          }
          if ((list.tail =(NodeType *) malloc(sizeof(NodeType) + sizeof(NodeType *))) == NULL){
                  printf(" loi cap phat!");
                  exit(EXIT_FAILURE);
          }
          list.tail->key=MAX_OF_KEY; //nut cuoi phai co gia tri khoa lon nhat
          list.ListLevel=1;
          for (int i=1;i<=MAXLEVEL;i++)
                  list.head->forward[i]=list.tail;
    }
    Chú ý mấy dòng chữ đậm.

    Cám ơn mấy bạn.
    Lưu ý type tiếng Việt có dấu rõ ràng và đúng chính tả
    Đã được chỉnh sửa lần cuối bởi rox_rook : 17-12-2008 lúc 08:08 AM.

  2. #2
    Ngày gia nhập
    09 2008
    Nơi ở
    Đà Nẵng
    Bài viết
    18

    À, còn đây là hình ảnh của cái list đó (Skiplist), mọi người xem :

    Cái header chỉ cần trường next thôi, ko cần trường dữ liệu. Còn cái hình node cuối có chữ NIL tưc là NULL đó mấy bạn.

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình chưa hiểu bạn muốn hỏi gì, nếu người ta dùng malloc thì bạn thay chỗ đó bằng new, đâu có gì khó ? malloc cũng như new mà.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    09 2008
    Nơi ở
    Đà Nẵng
    Bài viết
    18

    Khac nhau ở chỗ này :
    Khi mình dùng new, thì mình chỉ biêt dùng kiểu thế này :
    Code:
     node *tempPointer;
    
     tempPointer = new node;
    Do đó nó chỉ tạo vừa đủ ô nhớ cho một kiểu node (mà mình đã viêt ở trên)

    Còn như bạn thấy trong ví dụ trên, khi dùng malloc ng` ta có thể tạo thêm chỗ cho những trường con trỏ mới nằm trong node bằng cach lấy một số (là MAX_LEVEL) nhân với kich cỡ của một contrỏ kiểu node rồi sau đó gán kiểu cho node mới này. Điều này thì mình chưa làm được với new (new mình chỉ làm cố định kich cỡ của node đã khai báo).
    Đã được chỉnh sửa lần cuối bởi conan_godman : 16-12-2008 lúc 09:31 AM.

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    À, ra là như thế. Bạn muốn cấp n phần tử bằng new thì làm như sau :
    C Code:
    1. node *tempPointer;
    2. tempPointer = new node [n];
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    09 2008
    Nơi ở
    Đà Nẵng
    Bài viết
    18

    Mặc định Cấp phát động trong C++ [đang nan giải]

    Cám ơn meocon, nhưng mà bạn hiểu sai ý mình rồi.
    Không phải mình cấp phát n phần tử kiểu node, mà là muốn cấp n chỗ vừa đủ cho một mảng con trỏ mà mảng này lại là một trường của kiểu node. Vì mảng này không cố định kích thước.

    Bạn có thể hiểu là mình cấp phát cho một con trỏ kiểu node với một vùng thêm nữa dành cho một mảng là một trường của kiểu node này mà kích thước mảng đó là do mình quy định chứ không cố định.
    Ví dụ như thế này ( dùng malloc) :

    Code:
    node	*tempP;
    
    	tempP = (node*)malloc(sizeof(node)+newLevel*sizeof(node*));
    mà kiểu node khai báo thế này :
    Code:
    struct node{
    	data	key;
    	node	*next[1];
    };

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

    Thử đoạn này xem
    Java Code:
    1. #include <new>
    2. #include <cstdlib>
    3. #include <iostream>
    4.  
    5. struct node {
    6.     int key;
    7.     node* next[ 1 ];
    8. };
    9.  
    10. int main() {
    11.     node* tmp;
    12.     tmp = ( node* )std::malloc(
    13.         sizeof( node ) + 3*sizeof( node* )
    14.     );
    15.     std::cout << sizeof( *tmp ) << std::endl;
    16.  
    17.     free( tmp );
    18.  
    19.     node* o = reinterpret_cast< node* >(
    20.         ::operator new( sizeof( node ) + 3*sizeof( node* ) )
    21.     );
    22.  
    23.     std::cout << sizeof( *o ) << std::endl;
    24.     ::operator delete( o );
    25.  
    26.     return 0;
    27. }

  8. #8
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Hic,R2 ơi.ko có cách nào để dùng new thay thế cho malloc trong đoạn code demo của R2 đc sao
    Cánh Chym ứ mỏi

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

    Có gì r2 đọc source lại của "new" rồi nghĩ cách sau vì r2 vẫn còn thi, chưa nghiên cứu nhiều được, nhưng dùng placement-new như trên đúng là cái bản version của malloc( std::size_t number_of_bytes );. Tất nhiên r2 chưa test kĩ, nên không dám chắc nó đúng 100% đâu nhé !

  10. #10
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    @conan_godman : chung quy là bạn muốn convert code này thành new phải ko ?
    C Code:
    1. list.head =(NodeType *) malloc(sizeof(NodeType) + MAXLEVEL*sizeof(NodeType *));
    2. list.tail =(NodeType *) malloc(sizeof(NodeType) + sizeof(NodeType *));
    Bạn làm thế này nè :
    C Code:
    1. list.head =(NodeType *) new char [sizeof(NodeType) + MAXLEVEL*sizeof(NodeType *)];
    2. list.tail =(NodeType *) new char [sizeof(NodeType) + sizeof(NodeType *)];
    Tuy hơi ăn gian nhưng đảm bảo đúng yêu cầu của bạn
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

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

  1. Giải Thích Về Phương Thức windowClosing() trong Giao Diện WindowListener
    Gửi bởi toilatoi1992 trong diễn đàn Nhập môn lập trình Java
    Trả lời: 2
    Bài viết cuối: 06-10-2013, 07:18 PM
  2. Trả lời: 0
    Bài viết cuối: 04-11-2011, 03:38 PM
  3. Xóa file trong win ! Nan giải quá , nghĩ cả ngày nay chưa giải quyết được.
    Gửi bởi megaboyvn 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: 08-10-2009, 02:21 AM
  4. Hàm trong C++ không nằm trong main vẫn chạy đúng. Giải thích giúp?
    Gửi bởi tuvan1011 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 15
    Bài viết cuối: 02-09-2009, 12:58 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