Hiển thị kết quả từ 1 đến 10 / 10
  1. #1
    Tham gia
    30-05-2007
    Location
    Hà Nội
    Bài viết
    55
    Like
    0
    Thanked 2 Times in 1 Post

    Khai báo và sử dụng mảng động trong C/C++ ?

    Chào các bạn. Tôi có một vướng mắc muốn các bạn chỉ giúp trong C/C++.

    Tôi cần khai báo và sử dụng một mảng AAA chuư kiểu chuỗi (char *) chưa biết trước số phần tử. Số phần tử này tăng hay giảm tuỳ ý.

    Các bạn chỉ giúp cần khai báo và sử dụng như thế nào với mảng AAA? Khi cần tính số phần tử thì dùng hàm gì?

    Cảm ơn các bạn.
    Quote Quote

  2. #2
    Tham gia
    22-12-2007
    Location
    UIT
    Bài viết
    1,488
    Like
    0
    Thanked 1 Time in 1 Post
    vd:

    int *myArray;
    myArray = (int*)malloc(n*sizeof(int));

    Với n là số phần tử cần cấp phát

    Các kiểu dữ liệu khác cũng tương tự. Bạn có thể thay hàm malloc bằng hàm calloc

    myArray = (int*)calloc(n,sizeof(int));

  3. #3
    Tham gia
    24-12-2004
    Location
    Sài Gòn
    Bài viết
    197
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi TuanDHCN View Post
    Chào các bạn. Tôi có một vướng mắc muốn các bạn chỉ giúp trong C/C++.

    Tôi cần khai báo và sử dụng một mảng AAA chuư kiểu chuỗi (char *) chưa biết trước số phần tử. Số phần tử này tăng hay giảm tuỳ ý.

    Các bạn chỉ giúp cần khai báo và sử dụng như thế nào với mảng AAA? Khi cần tính số phần tử thì dùng hàm gì?

    Cảm ơn các bạn.
    Trong C++ có một cách nữa là dùng vector. Vector là một mảng có thể co giãn chiều dài tùy ý. Phần tử của vector được truy nhập bằng toán tử []. Số phần tử được cho bằng hàm size(). Bạn có thể xem thêm các phương thức khác của vector ở đây: http://www.cplusplus.com/reference/stl/vector/


    Ví dụ
    Code:
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main ()
    {
      unsigned int i;
    
      // constructors used in the same order as described above:
      vector<int> first;                                // empty vector of ints
      vector<int> second (4,100);                       // four ints with value 100
      vector<int> third (second.begin(),second.end());  // iterating through second
      vector<int> fourth (third);                       // a copy of third
    
      // the iterator constructor can also be used to construct from arrays:
      int myints[] = {16,2,77,29};
      vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );
    
      cout << "The contents of fifth are:";
      for (i=0; i < fifth.size(); i++)
        cout << " " << fifth[i];
    
      cout << endl;
    
      return 0;
    }
    (Nguồn: http://www.cplusplus.com/reference/s...or/vector.html )

    [=========> Bổ sung bài viết <=========]

    À còn nữa, để làm việc với các mảng ký tự độ dài tùy ý trong C++ có thể dùng kiểu string. Xem thêm: http://www.cplusplus.com/reference/string/string/
    Được sửa bởi quynhlan lúc 19:49 ngày 30-05-2008 Reason: Bổ sung bài viết

  4. #4
    Tham gia
    30-05-2007
    Location
    Hà Nội
    Bài viết
    55
    Like
    0
    Thanked 2 Times in 1 Post
    Cảm ơn các bạn đã chỉ giúp. Mình có một tình huống cụ thể thế này mong các bạn tiếp tục giúp đỡ.

    Ví dụ:

    Code:
    void TestArray(void)
    {
    	typedef struct tagConNguoi
    	{
    		char * Ten;
    		BYTE Tuoi;
    		char * SoThich;
    	}ConNguoi;
    
    	ConNguoi Toi, Ban;
    
    	Toi.Ten ="Tran Van A";
    	Toi.Tuoi = 26;
            //Khai báo như thế nào để nhập được 2 SoThich ?
    	Toi.SoThich[0] = "Xem phim";
    	Toi.SoThich[1] = "Choi game";
    
    	Toi.Ten ="Dai Ca Huynh";
    	Toi.Tuoi = 28;
            //Khai báo như thế nào để nhập được 4 SoThich ?
    	Toi.SoThich[0] = "Xem phim";
    	Toi.SoThich[1] = "Choi game";
    	Toi.SoThich[2] = "Du lich";
    	Toi.SoThich[3] = "Nghe nhac";
    
    }
    Mong các bạn chỉ giúp, mảng SoThich phải khai báo và cấp phát bộ nhớ như thế nào để tùy vào mỗi người sẽ khai báo được số sở thích khác nhau? Nếu khai báo sẵn mảng gồm n phần tử thì sẽ lãng phí bộ nhớ.

  5. #5
    Tham gia
    05-11-2007
    Bài viết
    69
    Like
    0
    Thanked 0 Times in 0 Posts
    Code:
    using std::string;
    using std::vector;
    ...
    vector<string> myHobbies;
    myHobbies.push_back ("Watching movies");
    myHobbies.push_back ("Playing games");
    
    ...
    vector<string> yourHobbies;
    yourHobbies.push_back ("Watching Movies");
    yourHobbies.push_back ("Playing Games");
    yourHobbies.push_back ("Travelling");
    yourHobbies.push_back ("Listening to Music");
    Khi dùng vector/string bác nhớ sử dụng reserve/erase/clear để tối ưu hóa việc sử dụng bộ nhớ (mặc dù STL containers tự quản lý mấy vụ này).

  6. #6
    Tham gia
    30-05-2007
    Location
    Hà Nội
    Bài viết
    55
    Like
    0
    Thanked 2 Times in 1 Post
    Mong các bạn chỉ giúp mình cách làm theo mục đích dươí đây.

    Quote Được gửi bởi TuanDHCN View Post
    Cảm ơn các bạn đã chỉ giúp. Mình có một tình huống cụ thể thế này mong các bạn tiếp tục giúp đỡ.

    Ví dụ:

    Code:
    void TestArray(void)
    {
    	typedef struct tagConNguoi
    	{
    		char * Ten;
    		BYTE Tuoi;
    		char * SoThich;
    	}ConNguoi;
    
    	ConNguoi Toi, Ban;
    
    	Toi.Ten ="Tran Van A";
    	Toi.Tuoi = 26;
            //Khai báo như thế nào để nhập được 2 SoThich ?
    	Toi.SoThich[0] = "Xem phim";
    	Toi.SoThich[1] = "Choi game";
    
    	Toi.Ten ="Dai Ca Huynh";
    	Toi.Tuoi = 28;
            //Khai báo như thế nào để nhập được 4 SoThich ?
    	Toi.SoThich[0] = "Xem phim";
    	Toi.SoThich[1] = "Choi game";
    	Toi.SoThich[2] = "Du lich";
    	Toi.SoThich[3] = "Nghe nhac";
    
    }
    Mong các bạn chỉ giúp, mảng SoThich phải khai báo và cấp phát bộ nhớ như thế nào để tùy vào mỗi người sẽ khai báo được số sở thích khác nhau? Nếu khai báo sẵn mảng gồm n phần tử thì sẽ lãng phí bộ nhớ.

  7. #7
    Tham gia
    24-12-2004
    Location
    Sài Gòn
    Bài viết
    197
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi TuanDHCN View Post
    Mong các bạn chỉ giúp mình cách làm theo mục đích dươí đây.
    ilovecxx đã chỉ cho bạn 1 cách rồi. Bạn đọc kỹ mã nguồn của bạn ấy đi. Nếu có gì không vừa ý thì nói rõ ra chứ không thể "phớt lờ" như thế được.

  8. #8
    Tham gia
    30-05-2007
    Location
    Hà Nội
    Bài viết
    55
    Like
    0
    Thanked 2 Times in 1 Post
    Quote Được gửi bởi ilovecxx View Post
    Code:
    using std::string;
    using std::vector;
    ...
    vector<string> myHobbies;
    myHobbies.push_back ("Watching movies");
    myHobbies.push_back ("Playing games");
    
    ...
    vector<string> yourHobbies;
    yourHobbies.push_back ("Watching Movies");
    yourHobbies.push_back ("Playing Games");
    yourHobbies.push_back ("Travelling");
    yourHobbies.push_back ("Listening to Music");
    Khi dùng vector/string bác nhớ sử dụng reserve/erase/clear để tối ưu hóa việc sử dụng bộ nhớ (mặc dù STL containers tự quản lý mấy vụ này).

    Cảm ơn bạn, theo cách của bạn mình đã làm đợc rôì.

    Quote Được gửi bởi TQN
    Thử khai báo theo style của MS coder:
    .......
    char* ppsz[0];
    };
    Các bạn cho mình hỏi có thể dùng theo kiêủ cấp phát bộ nhớ, kiêủ con trỏ được không nhỉ ? Hay nói cách khác là dùng thuần kiêủ C ?

  9. #9
    Tham gia
    24-12-2004
    Location
    Sài Gòn
    Bài viết
    197
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi TuanDHCN View Post
    Các bạn cho mình hỏi có thể dùng theo kiêủ cấp phát bộ nhớ, kiêủ con trỏ được không nhỉ ? Hay nói cách khác là dùng thuần kiêủ C ?
    Bạn có thể tạo 1 mảng xâu (mảng mà mỗi phần tử là 1 xâu) bằng con trỏ char**, mời bạn xem: http://www.ddth.com/showthread.php?t=184303
    Nhưng chú ý là theo cách này thì khi biên tập xâu trong mảng, bạn phải tự cài đặt cơ chế "co giãn" xâu (tức là cấp lại bộ nhớ).

  10. #10
    Tham gia
    30-05-2007
    Location
    Hà Nội
    Bài viết
    55
    Like
    0
    Thanked 2 Times in 1 Post
    Quote Được gửi bởi quynhlan View Post
    Bạn có thể tạo 1 mảng xâu (mảng mà mỗi phần tử là 1 xâu) bằng con trỏ char**, mời bạn xem: http://www.ddth.com/showthread.php?t=184303
    Nhưng chú ý là theo cách này thì khi biên tập xâu trong mảng, bạn phải tự cài đặt cơ chế "co giãn" xâu (tức là cấp lại bộ nhớ).
    Cảm ơn bạn. Mình đang đọc và làm thử.

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •