Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Lỗi chương trình không nhận biến(không return được biến từ public sang main)

  1. #1
    Ngày gia nhập
    09 2011
    Nơi ở
    Khi ta ở chỉ là nơi đất ở, khi ta đi đất bỗng hóa tâm hồn
    Bài viết
    55

    Mặc định Lỗi chương trình không nhận biến(không return được biến từ public sang main)

    Lỗi như sau:
    error: 'so1' was not declared in this scope
    code của mình như sau:
    C++ Code:
    1. #include<iostream.h>
    2. typedef struct solon
    3. {
    4.     char *chuso;
    5. } solon;
    6. class pheptoan
    7. {
    8.     public:
    9.     solon so1,so2,kq;
    10.     solon nhapsolon();
    11.     void cong(solon a,solon b);
    12.     void tru(solon a,solon b);
    13.     void nhan(solon a,solon b);
    14.     void giaithua(solon a,solon b);
    15. };
    16. int main()
    17. {
    18.     pheptoan ob;
    19.     so1 = ob.nhapsolon();
    20.     return 0;
    21. }
    22. /*----------------------------------------------------------------------------*/
    23. solon pheptoan::nhapsolon()
    24. {
    25.     solon sonhapvao;
    26.     char *so;
    27.     cout<<"Moi ban nhap so lon:";
    28.     so = new char[NULL];
    29.     cin>>so;
    30.     cout<<"so ban vua nhap la:";
    31.     sonhapvao.chuso = so;
    32.     cout<<sonhapvao.chuso;
    33.     return sonhapvao;
    34. }
    Tại sao mình khai báo biến trong public mà vẫn lỗi???
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi nang : 01-10-2011 lúc 04:51 PM.
    Cái thuở còn đánh con bé hàng xóm chỉ vì nó không xách cặp hộ đi học. Cái thuở thèm làm người lớn, để bố mẹ khỏi đánh đòn đau mỗi khi mắc lỗi, để được “con nít” gọi mình là người lớn. Cái thuở con nít. Cái thuở ấy xa thật xa. Cô bé hàng xóm đi lấy chồng. Tôi không còn con nít. Và đôi lúc cái thằng người lớn như đã ước mơ một thời, giờ…Vâng…Rất lạ..Có khi nó muốn làm con nít!

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

    Public và toàn cục khác nhau hoàn toàn. Bạn khai báo public tức là biến có thể truy xuất từ ngoài vào nhưng vẫn phải thông qua instance của class ( ví dụ như ob.so1 ). Bạn cần đọc kỹ lý thuyết cơ bản về lthdt. Đây là những kiến thức rất rất cơ bản.

    Thêm chỗ này nữa :
    C++ Code:
    1. so = new char[NULL];
    Bạn cấp phát 0 phần tử, nhưng xuống dưới lại :
    C++ Code:
    1. cin>>so;
    -> Làm gì có chỗ cho cin nhét vào ?
    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.

  3. #3
    Ngày gia nhập
    09 2011
    Nơi ở
    Khi ta ở chỉ là nơi đất ở, khi ta đi đất bỗng hóa tâm hồn
    Bài viết
    55

    Cảm ơn mèo con lông vàng.
    Nhưng mình vẫn cin được. ban đầu mình cho người dùng nhập độ dài vào trước, sau đó cấp phát cho nó để nó nhét vừa đủ. Nhưng mình bỏ đi và khi in ra thì nó nó in đầy đủ mặc dù khai báo NULL như trên.
    Hỏi bạn meoconlongvang 1 câu nữa nhé:
    Nếu như không khai báo như bạn nói thì có cách gì tốt hơn ngoài cấp phát trước không?
    Đã được chỉnh sửa lần cuối bởi nang : 01-10-2011 lúc 05:08 PM.
    Cái thuở còn đánh con bé hàng xóm chỉ vì nó không xách cặp hộ đi học. Cái thuở thèm làm người lớn, để bố mẹ khỏi đánh đòn đau mỗi khi mắc lỗi, để được “con nít” gọi mình là người lớn. Cái thuở con nít. Cái thuở ấy xa thật xa. Cô bé hàng xóm đi lấy chồng. Tôi không còn con nít. Và đôi lúc cái thằng người lớn như đã ước mơ một thời, giờ…Vâng…Rất lạ..Có khi nó muốn làm con nít!

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

    Ko phải cứ thấy chạy được là khẳng định điều đó là đúng. Bạn làm chương trình nhỏ, có vài hàm thôi nên bạn ko thấy được cái tai họa khó lường của những hành động sử dụng bộ nhớ 1 cách cố chấp như thế. Lấy ví dụ đơn giản nhé, giả sử có đoạn code sau ( test thử trên vc ) :
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void main()
    5. {
    6.     long v1 = 100;
    7.     char v2[4];
    8.    
    9.     v2[5] = 'a';
    10.  
    11.     if (v1 == 100)
    12.     {
    13.         printf("Ok\n");
    14.     }
    15.     else
    16.     {
    17.         printf("Failed\n");
    18.     }
    19.  
    20.     getch();
    21. }

    Đoạn code chạy thì vẫn chạy được đấy, chương trình ko bị crash. Nhưng thật ra nó chạy cực kỳ bất ổn. Do v2 chỉ chứa được 4 phần tử, bạn xài tới 6 ( index = 5 ), tức là bạn đang ghi lấn qua phần đất của v1 đấy. Và v1 đã bị sửa giá trị, dẫn tới đoạn code kiểm tra phía dưới chạy ko chính xác. Trường hợp cấp 0 mà xài ko chừng mực của bạn cũng tương tự như vậy đó. Bạn may mắn chưa crash chương trình là vì vùng ghi lố vẫn nằm trong vùng nhớ có tồn tại, nhưng mà là của biến khác. Chương trình chỉ crash khi đọc/ghi trúng vùng nhớ ko tồn tại mà thôi. Nếu phía dưới còn có những đoạn code khác nữa thì có khả năng nó sẽ chạy lung tung, ko biết đâu mà lần. Bạn tưởng tượng làm chương trình lớn, có nhiều biến, nhiều đoạn kiểm tra điều kiện, do nhiều người code. Bạn viết 1 đoạn code để lại rác cho người sau như thế, khi chương trình lỗi biết debug thế nào ?

    Có thể mình nói hơi nhiều, nhưng mình thấy các bạn mới học lập trình có thói quen xấu là chỉ nhìn bề ngoài và hay đổi thừa cho máy. Nhiều bạn đã viết code như bạn, và cũng cãi rằng ko bị gì. Đến khi code bị bug do lỗi này thì debug mãi ko ra. Chương trình chạy như "ma ám", lúc sai, lúc đúng. Nhiều bạn thấy thế "phán" chắc nịch rằng cpu bị lỗi, xử lý sai. Nhưng cuối cùng thì máy vẫn đúng, chỉ có người mới là sai.

    Trường hợp code của bạn, nếu bạn biết trước được số phần tử tối đa thì bạn nên khai báo mảng tĩnh. Còn trường hợp ko biết thì phải kêu người dùng nhập số phần tử vào và cấp phát động chừng ấy phần tử cho mảng.
    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.

  5. #5
    Ngày gia nhập
    09 2011
    Nơi ở
    Khi ta ở chỉ là nơi đất ở, khi ta đi đất bỗng hóa tâm hồn
    Bài viết
    55

    Cảm ơn bạn đã góp ý chân thành. Mình xin nhận khuyết điểm. Đúng là chương trình chạy lúc được, lúc không.
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Cái thuở còn đánh con bé hàng xóm chỉ vì nó không xách cặp hộ đi học. Cái thuở thèm làm người lớn, để bố mẹ khỏi đánh đòn đau mỗi khi mắc lỗi, để được “con nít” gọi mình là người lớn. Cái thuở con nít. Cái thuở ấy xa thật xa. Cô bé hàng xóm đi lấy chồng. Tôi không còn con nít. Và đôi lúc cái thằng người lớn như đã ước mơ một thời, giờ…Vâng…Rất lạ..Có khi nó muốn làm con nít!

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

  1. Hàm trong C++ Không biết cách in ra màn hình khi khai báo public: float ttb
    Gửi bởi nanqua trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 01-04-2012, 04:15 PM
  2. ai biết về return????
    Gửi bởi demlanh.102 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 22-09-2011, 09:32 AM
  3. Thuộc tính khóa ngoài( tham chiếu) biến mất khi biến đổi từ file XML sang DataTable
    Gửi bởi itmanhieu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 17-08-2011, 08:02 PM
  4. Gọi biến public static từ 2 namespace khác nhau.
    Gửi bởi thuan199 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 21-01-2011, 10:08 AM
  5. Copy return value sang một biến khác.
    Gửi bởi noob trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 06-06-2010, 12:04 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