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

Đề tài: Lỗi do hàm assert???

  1. #1
    Ngày gia nhập
    11 2012
    Bài viết
    5

    Mặc định Lỗi do hàm assert???

    Chào các bác, tình hình là em có một bài tập nhỏ về overloading operator. Yêu cầu là phải xây dựng các phép toán trên class Mod để tính mod q của 1 số m.

    C++ Code:
    1. class Mod{
    2.     public:
    3.         Mod();                                                                                                                                     
    4.         Mod(unsigned int);                                                                 
    5.         ~Mod();
    6.         unsigned int get_modulo() const;                                                   
    7.         void set_modulo(int);                                                              
    8.         unsigned int get_m() const;
    9.         void valid() const;                                                            
    10.        
    11.         friend Mod operator+(const Mod&, const Mod&);                              
    12.         friend Mod operator-(const Mod&, const Mod&);                              
    13.         friend Mod operator*(const Mod&, const Mod&);                              
    14.         friend bool operator==(const Mod& , const Mod&);                           
    15.         friend bool operator!=(const Mod&, const Mod&);                            
    16.         friend std::ostream& operator<<(std::ostream& cout, const Mod&);       
    17.  
    18.         Mod operator++();                                                                      
    19.         Mod operator++(int);                                                                   
    20.         Mod operator--();                                                                      
    21.         Mod operator--(int);                                                                   
    22.        
    23.         unsigned int pot(const unsigned int);                                           // (a^n) mod q
    24.  
    25.     private:
    26.         static unsigned int q;
    27.         unsigned int m;
    28. };

    Yêu cầu là phải kiểm tra m trước khi thực hiện các phép toán sao cho thỏa m<q, và m>0.
    Đây là hàm valid dùng để kiểm tra điều kiện trên.
    C++ Code:
    1. void Mod::valid() const {
    2.     assert(this->m < this->q);
    3.     assert(this->m >= 0);
    4. }
    Tuy nhiên khi chạy thì chương trình báo lỗi "This application has requested the Runtime to terminate it in an unusual way" cả trên Visual Studio và Codeblocks tại dòng assert(this->m < this->q); . Có bác nào có thể giải thích lý do cho em được không .

  2. #2
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Biến static chỉ có thể được được gọi với phương thức static bạn à, mà phương thức static giống với hàm friend cùng không có con trỏ this. các biến static trong lớp phải được khởi tạo riêng (C++11 thì có thể khởi tạo luôn) bạn thử chuyển hàm void valid() const; thành static void valid() xem sao; và khởi tạo lại các biến static .sorry bạn copy không để ý static rồi hằng nữa lại thành sai để mình copy về thử xem sao
    unsigned int Mode::q=value;
    http://www.learncpp.com/cpp-tutorial...ber-functions/
    Đã được chỉnh sửa lần cuối bởi kimcy1992 : 08-12-2012 lúc 09:12 PM.
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  3. #3
    Ngày gia nhập
    11 2012
    Bài viết
    5

    Trích dẫn Nguyên bản được gửi bởi kimcy1992 Xem bài viết
    Biến static chỉ có thể được được gọi với phương thức static bạn à, mà phương thức static giống với hàm friend cùng không có con trỏ this. các biến static trong lớp phải được khởi tạo riêng (C++11 thì có thể khởi tạo luôn) bạn thử chuyển hàm void valid() const; thành static void valid() const xem sao; và khởi tạo lại các biến static
    unsigned int Mode::q=value;
    http://www.learncpp.com/cpp-tutorial...ber-functions/
    Cảm ơn bác đã trả lời, nhưng vẫn không được. Vấn đề là ở chỗ m có thể nhận nhiều giá trị, ví dụ đầu tiên khởi tạo q = 17 thì m có thể nhận giá trị từ 0->16. Khởi tạo biến q thì em đã khởi tạo ngay từ đầu ở file definition Mod.cpp rồi.
    Em thử sửa thành
    C++ Code:
    1. static unsigned int get_modulo();                                                  
    2. void set_modulo(int);                                                              
    3. unsigned int get_m() const;
    4. static void valid();

    C++ Code:
    1. unsigned int Mod::q = 2;
    2.  
    3. void Mod::valid() {                              // khong dat static them 1 lan nua
    4.     assert(Mod::m < q);
    5.     assert(Mod::m >= 0);
    6. }
    thì compiler báo lỗi
    C++ Code:
    1.  //error C2597: illegal reference to non-static member 'Mod::m'


    Quên mất bổ sung luôn 1 câu hỏi nữa . Ví dụ em khai báo là
    C++ Code:
    1. Mod::Mod(unsigned int n) : m(n) {};
    Vậy thì trong trường hợp khởi tạo 1 object là Mod a(-2) thì compiler sẽ tạo ra 1 object có giá trị là 4294967294 = 4294967295 (UINT_MAX - 1). Có cách nào để tránh trường hợp này không. Ví dụ nếu giá trị đưa vào là âm thì ngăn không cho khởi tạo luôn???
    Đã được chỉnh sửa lần cuối bởi phongdt : 08-12-2012 lúc 09:17 PM.

  4. #4
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Không biết bạn có để ý các hàm friend thường thì nó sẽ sử dụng các đối tượng của lớp bạn mà nó làm việc, mình áp dụng nguyên tắc đó để áp dụng với bài này, chính vì không có this pointer nên mình sử dụng chính đối tượng đó để làm đối số của ham void valid ở dạng tham chiếu bạn thử test cái này xem mình test thấy ok, còn cách nào nữa thì chờ các cao thủ vâyk sorry bạn copy không để ý static rồi lại còn const ở hàm void valid
    C++ Code:
    1. #include<iostream>
    2. #include<assert.h>
    3. using namespace std;
    4. class Mod{
    5.     public:
    6.         Mod(){}                                                                                                                                    
    7.         Mod(unsigned int a): m(a){}                                                                
    8.         ~Mod(){}
    9.         unsigned int get_modulo() const;                                                    
    10.         void set_modulo(int);                                                              
    11.         unsigned int get_m() const;
    12.         static void valid(Mod &);                                                            
    13.        
    14.         friend Mod operator+(const Mod&, const Mod&);                              
    15.         friend Mod operator-(const Mod&, const Mod&);                              
    16.         friend Mod operator*(const Mod&, const Mod&);                              
    17.         friend bool operator==(const Mod& , const Mod&);                            
    18.         friend bool operator!=(const Mod&, const Mod&);                            
    19.         friend std::ostream& operator<<(std::ostream& cout, const Mod&);        
    20.  
    21.         Mod operator++();                                                                      
    22.         Mod operator++(int);                                                                    
    23.         Mod operator--();                                                                      
    24.         Mod operator--(int);                                                                    
    25.        
    26.         unsigned int pot(const unsigned int);                                           // (a^n) mod q
    27.  
    28.     private:
    29.         static unsigned int q;
    30.         unsigned int m;
    31. };
    32.  
    33. unsigned int Mod::q=9;
    34. void Mod::valid(Mod & mod)
    35. {
    36.     assert(mod.m < q);
    37.     assert(mod.m >= 0);
    38.     cout<<"Correct"<<endl;
    39. }
    40.  
    41. int main()
    42. {
    43.     Mod mod(6);
    44.     mod.valid(mod);//vẫn là phương thức của lớp không giống hàm  friend tự do
    45.     system("pause");
    46.     return 0;
    47. }
    Mình cũng đang tự học cái này mà, có gì trao đổi hì , ôn với thi bù lu quá.
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

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

  1. Bài tập C++ Sử dụng assert macro để kiểm tra tính hợp lệ của 3 tham số cạnh tam giác
    Gửi bởi Hien_QG trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 25-03-2013, 10:14 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