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

Đề tài: Ý tưởng mảng hỗn hợp nhiều kiểu, mong mọi người giúp mình!!!

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    50

    Unhappy Ý tưởng mảng hỗn hợp nhiều kiểu, mong mọi người giúp mình!!!

    (C++)Mình muồn viết một hàm để nhập một mảng,mảng đó với các phần tử có kiểu là char(1byte), int,float(4 byte),double(8byte),char*(xem nhu chuoi nhap toi da 16 ki) tu).Mảng a có các phần tử có thể có các kiểu trên tức là các phần tử mảng a không nhất thiết chứa một kiểu,Nếu sau khi thực hiện được điều trên mình có thể nâng cấp chương trình bằng cách viết thêm hàm để tìm phần tử kiêu nào đó(chẳng hạn nhủ tìm số thực lớn nhất chẳng hạn) theo yêu cầu người nhập(hàm này không khó cho lắm),rồi tiếp đến nâng cấp chương trình lên với mảng có khả năng chứa kiểu đối tượng!!!
    Mình có ý tưởng la(chỉ sư dụng được với các kiểu kia chứ chưa đựoc với object):giả sử người nhập nhập kiêu:float giá tri:19.9 chẳn hạn thì mình sẻ lưu vào một chuỗi byte với byte đầu 4,sau đó đem chép 19.9 vào 4 byte tiếp theo,nhap kieu:int gia tri: 155, thì byte kế tiếp sẽ là 2 rồi hai byte ké tiếp nữa đẻ lưu giá trị 155rồi cứ thế tạo nên một chuỗi byte dài, nhưng để viết code thì mình vẫn đang suy nghĩ(khó quá), nên vẫn chưa thực hiện đươc, có thẻ sử dụng danh sách liên kết nhưng không hay.bạn nào làm được cứ post code lên cho anh em học hỏi nha!!!!thank!!!!!!!!!!!!!!!làm được tới đau hay tới đó

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Mặc định Giải pháp mảng hỗn hợp cho ANSI C

    Chính ý tưởng của bạn quá rắc rối kiến bạn khó khăn trong việc thực thi.

    Tôi đề xuất 1 giải pháp mà khá ít người (theo tôi biết) sử dụng khi lập trình với C. Đó là sử dụng kiểu dữ liệu void.

    Bây giờ tôi mô tả 1 phần tử của mảng của bạn có kiểu sau:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		manghonhop.gif
Lần xem:	4
Size:		3.3 KB
ID:		5325

    Bước đầu như vậy đã. Bạn thử suy nghĩ về cách của tôi rồi cho ý kiến.
    Đã được chỉnh sửa lần cuối bởi Tarzan : 17-10-2007 lúc 05:18 PM. Lý do: Up ảnh

  3. #3
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Quản lý như bạn Tarzan cũng tốt, nhưng code sẽ hơi phức tạp hơn 1 chút và tốn bộ nhớ (sizeof(ELEMENT) + sizeof(POINTER) + sizeof(*POINTER))

  4. #4
    Ngày gia nhập
    10 2006
    Nơi ở
    Rừng Amazon
    Bài viết
    101

    Bác có cao kiến gì không? Trước đây em cũng gặp bài toán này và giải quyết theo cách đó.
    Theo cách này, em thấy chỉ lãng phí bộ nhớ cho việc lưu trữ con trỏ, còn việc lưu kiểu của thành phần và giá trị của thành phần là không thể tránh khỏi.

  5. #5
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Trong C/C++ thường, người ta thường dùng struct với size thay đỗi, = cách thêm vào 1 trường cuối cùng của struct 1 array 0 phần tử (thường gặp trong Windows SDK header files).
    Ta có thể khai báo lại như sau:
    C++ Code:
    1. typedef struct _tagELEMENT
    2. {
    3.     ELEMENT_TYPE et;
    4.     INT size;
    5.     BYTE data[0];
    6. } ELEMENT, *LPELEMENT;

  6. #6
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Mặc định Ý tưởng mảng hỗn hợp nhiều kiểu, mong mọi người giúp mình!!!

    Tui nhớ hình như trước kia cũng có một câu hỏi tương tự như câu này thì phải. Ngày xưa C thì phải dùng void * (cái này không đảm bảo tốt vấn đề type safety nên đừng có sử dụng), còn C++ ngày nay thì em mời bác lên www.boost.org để down thằng Boost về rùi ngâm cứu 2 thư viện Boost.Variant or Boost.Any để giải quyết vấn đề của bác. Cách dùng cụ thể có ghi rõ và chi tiết ở trong documentation.

    Sample code (dùng biến đơn):
    C++ Code:
    1. /*
    2. ** Variant and any demostration
    3. ** with common type and user-defined type
    4. */
    5. //comment the following line if not using STLport
    6. #define _STLP_USE_BOOST_SUPPORT 1
    7. #include <string>
    8. #include <cstdlib>
    9. #include <iostream>
    10. #include <vector>
    11. #include <algorithm>
    12. #include <boost/variant.hpp>
    13. #include <boost/any.hpp>
    14.  
    15. using std::vector;
    16. using std::string;
    17. using std::cout;
    18. using std::cerr;
    19. using std::endl;
    20. using std::ostream;
    21. using std::for_each;
    22. using boost::variant;
    23. using boost::any;
    24.  
    25. class PersonalInfo;
    26. typedef any Any;
    27. typedef variant <int, double, string, PersonalInfo> Variant;
    28.  
    29. /* User-defined type */
    30. class PersonalInfo {
    31. public:
    32.     PersonalInfo (const string & name, uint16_t age)
    33.     {
    34.          name_ = name;
    35.          age_  = age;
    36.     }
    37.    
    38.     ~PersonalInfo ()
    39.     {
    40.         name_.erase ();
    41.         age_ = 0;
    42.     }  
    43.    
    44. public:    
    45.     friend ostream & operator<< (ostream & os, const PersonalInfo & pi)
    46.     {
    47.         os << "Full Name:" << pi.name_ << endl;
    48.         os << "Age:" << pi.age_ << endl;
    49.         return os;
    50.     }
    51.    
    52. private:
    53.     string name_;
    54.     uint16_t age_;
    55. };
    56.  
    57. int main(int argc, char *argv[])
    58. {
    59.     try
    60.     {
    61.         Variant v;
    62.         v = "Hello world";
    63.         v = 1;
    64.         cout << boost::get<int>(v) << endl;
    65.        
    66.         Any anything;
    67.         anything = string ("hello world");
    68.         anything = PersonalInfo ("Peter", 16);
    69.         cout << boost::any_cast<PersonalInfo>(anything) << endl;
    70.     }
    71.  
    72.     catch (boost::bad_any_cast & exception) {
    73.         cerr << exception.what () << endl;
    74.         system ("PAUSE");
    75.         return EXIT_FAILURE;
    76.     }
    77.  
    78.     catch (boost::bad_get & exception) {
    79.         cerr << exception.what () << endl;
    80.         system ("PAUSE");
    81.         return EXIT_FAILURE;
    82.     }
    83.    
    84.     catch (...) {
    85.         cerr << "Unknown exception" << endl;
    86.         system ("PAUSE");
    87.         return EXIT_FAILURE;
    88.     }
    89.     system("PAUSE");
    90.     return EXIT_SUCCESS;
    91. }
    Đã được chỉnh sửa lần cuối bởi ilovecplusplus : 18-10-2007 lúc 03:24 AM.
    Our dreams are young and we both know they take us where we want to go...

  7. #7
    Ngày gia nhập
    11 2006
    Bài viết
    75

    Sample code dùng mảng:
    C++ Code:
    1. /*
    2. ** Variant and any demostration
    3. ** with common type and user-defined type
    4. */
    5. // Comment the following line if not using STLport
    6. #define _STLP_USE_BOOST_SUPPORT 1
    7. #include <string>
    8. #include <cstdlib>
    9. #include <iostream>
    10. #include <vector>
    11. #include <algorithm>
    12. #include <boost/variant.hpp>
    13. #include <boost/any.hpp>
    14.  
    15. using std::vector;
    16. using std::string;
    17. using std::cout;
    18. using std::cerr;
    19. using std::endl;
    20. using std::ostream;
    21. using std::for_each;
    22. using boost::variant;
    23. using boost::any;
    24.  
    25. class PersonalInfo;
    26. typedef any Any;
    27. typedef variant <int, double, string, PersonalInfo> Variant;
    28. typedef vector <Variant> VariantContainer;
    29. typedef vector <any> StoreAnythingContainer;
    30.  
    31. /* User-defined type */
    32. class PersonalInfo {
    33. public:
    34.     PersonalInfo (const string & name, uint16_t age)
    35.     {
    36.          name_ = name;
    37.          age_  = age;
    38.     }
    39.    
    40.     ~PersonalInfo ()
    41.     {
    42.         name_.erase ();
    43.         age_ = 0;
    44.     }  
    45.    
    46. public:    
    47.     friend ostream & operator<< (ostream & os, const PersonalInfo & pi)
    48.     {
    49.         os << "Full Name:" << pi.name_ << endl;
    50.         os << "Age:" << pi.age_ << endl;
    51.         return os;
    52.     }
    53.    
    54. private:
    55.     string name_;
    56.     uint16_t age_;
    57. };
    58.  
    59. class PrintContentVisitor: public boost::static_visitor <void> {
    60. public:
    61.     void operator () (const string & value) const
    62.     {
    63.         cout << value << endl;
    64.     }
    65.    
    66.     void operator () (int & value) const
    67.     {
    68.         cout << value << endl;
    69.     }
    70.    
    71.     void operator () (double & value) const
    72.     {
    73.         cout << value << endl;
    74.     }
    75.    
    76.     void operator () (const PersonalInfo & value) const
    77.     {
    78.         cout << value << endl;
    79.     }
    80. };
    81.  
    82. int main(int argc, char *argv[])
    83. {
    84.     VariantContainer array;
    85.     PrintContentVisitor printer;
    86.        
    87.     array.push_back ("Hello World");
    88.     array.push_back (1024);
    89.     array.push_back (10.24);
    90.     array.push_back (PersonalInfo ("J.Smith", 20));
    91.        
    92.     for_each (
    93.         array.begin (),
    94.         array.end (),
    95.         boost::apply_visitor (printer)
    96.     );
    97.  
    98.     system("PAUSE");
    99.     return EXIT_SUCCESS;
    100. }
    Đã được chỉnh sửa lần cuối bởi ilovecplusplus : 18-10-2007 lúc 03:20 AM.
    Our dreams are young and we both know they take us where we want to go...

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Chi mà phức tạp vấn đề thế, ilovecplusplus.

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

  1. mong mọi người giúp đỡ về bài tập
    Gửi bởi dothebao trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 09-11-2013, 07:56 AM
  2. Lập trình C chương trình này sai ở đâu? mong mọi người giúp em
    Gửi bởi cauchu.noah trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 11-09-2013, 12:08 PM
  3. Bài tập C MỘT SỐ BÀI TẬP C VỀ VÒNG LẶP(mong mọi người giúp đỡ)
    Gửi bởi hieurau123 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 9
    Bài viết cuối: 15-06-2013, 03:45 PM
  4. Bài toán Lớp đa giác.Mong mọi người giúp đỡ
    Gửi bởi congtuazx trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 27-04-2009, 09:13 PM
  5. bài tập về con trỏ, mong các bạn chỉ giúp
    Gửi bởi kill_3r trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 03-04-2009, 07:23 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