void CConstructPAT2Dlg::OnIptstr() {

   UpdateData(true);

   Tree Cay(m_strTokenString); //tạo đối tượng Cay

   m_strTest=Cay.node[0][0].index; //lấy nội dung từ Cay và hiển thị

   UpdateData(false);

}

Khi gán trường path2node của thuộc tính node[0][0] cho m_strTest (để lấy ra), khi chạy bị báo lỗi. Nếu trong class SubPart khai báo trường "path2node" sau trường "index" thì không lấy được trường index. Xin hướng dẫn.

" />
  • Thứ Sáu, 04/06/2004 16:57 (GMT+7)

    Câu hỏi :

    Dùng VC++, tạo project theo MFCAppWizard với chế độ dialog based, trong đó tạo 2 class mới độc lập như sau:

    class subpart { // trong file subpart.h

    public:

                CString path2node;

                CString index;

                subpart();

                virtual ~subpart();

    };

    class Tree  { //trong file Tree.h

    public:

                CString Input;

                Tree();

                Tree(CString s);

                void TreeConstruction(CString InputStr);

                void Insert(int SIS);     

                virtual ~Tree();

                subpart node[][2];

    };

    Hàm khởi tạo có tham số của lớp Tree được định nghĩa trong file Tree.cpp như sau:

    Tree::Tree(CString s) { // trong file Tree.cpp

       Input=s;

       node[0][0].index = Input;

       node[0][0].path2node = Input;

    }

    Trong dialog box của chương trình có 3 đối tượng: 1 button và 2 EditBox. Khai báo biến kết hợp với EditBox1 tên là m_strTokenString, biến kết hợp với EditBox2 tên là m_strTest. Hàm xử lý sự kiện "Click" cho button như sau:

    void CConstructPAT2Dlg::OnIptstr() {

       UpdateData(true);

       Tree Cay(m_strTokenString); //tạo đối tượng Cay

       m_strTest=Cay.node[0][0].index; //lấy nội dung từ Cay và hiển thị

       UpdateData(false);

    }

    Khi gán trường path2node của thuộc tính node[0][0] cho m_strTest (để lấy ra), khi chạy bị báo lỗi. Nếu trong class SubPart khai báo trường "path2node" sau trường "index" thì không lấy được trường index. Xin hướng dẫn.



    Trả lời :

    Nguyên nhân chương trình của bạn báo lỗi là do phát biểu khai báo thuộc tính node[][2] trong class Tree, phát biểu này khai báo dãy node chưa có phần tử nào (zero-sized array), do đó nếu bạn truy xuất bất kỳ phần tử nào trong dãy (thí dụ node[0][0].index) thì hệ thống sẽ báo lỗi. Phát biểu khai báo dãy dạng node[][2] chỉ mới khai báo hình thức 1 dãy phần tử nhưng dãy cụ thể thì chưa có, nó chỉ được dùng trong những trường hợp đặt biệt và chỉ có những người nắm vững kỹ thuật này mới dùng được. Tóm lại nếu bạn muốn khai báo 1 dãy node có số lượng phần tử được xác định động ứng với mỗi đối tượng của class Tree, bạn nên dùng biến pointer, thí dụ như phát biểu sau:

    subpart **node; // node là array 2 chiều nhưng số lượng chưa xác định

    Mỗi khi cần xác định cụ thể số lượng phần tử của dãy, bạn nên dùng cơ chế phân phối động các phần tử trong hàm Tree như sau:

    // tạo ma trận n*m phần tử cho thuộc tính node

    Tree::Tree(CString s, int n, int m) {

    int i;

       // phân phối n pointer cho thuộc tính node

       node = (subpart**)malloc(n*sizeof(void*));

       // tạo m phần tử subpart cho mỗi node[i]

       for (i=0; i<n; i++) node[i] = new subpart[m];

       Input=s;

       node[0][0].index = Input;

       node[0][0].path2node = Input;

    }

    Chuyên mục: Lập trình