Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Vấn đề về sử dụng DSLK với các class trong C++

  1. #1
    Ngày gia nhập
    04 2010
    Bài viết
    69

    Mặc định Vấn đề về sử dụng DSLK với các class trong C++

    Các anh chị sửa giùm em bài này với! Bài này em mắc lỗi gì các anh chị nói rõ cho em luôn
    Code:
    #include<conio.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    #include<string.h>
    using namespace std;
    	class date
    	{
    	  int day,month,year;
    	  public:
    	  void nhap()
    	  {
    		 cout<<"\n nhap vao ngay:";cin>>day;
    		 cout<<"\n nhap vao thang:";cin>>month;
    		 cout<<"\n nhap vao nam:";cin>>year;
    	  }
    	  void hienthinv()
    	  {
    		cout<<"\n ngay : "<<day<<" thang: "<<month<<" nam: "<<year;
    	  }
    	  int get_year()
    		{
    			int a=year;
    			return a;
    		}
    	};
    	class nhanvien
    	{
    	  char manv[20],ten[20],diachi[20],quequan[20];
    	  date ngaysinh;
    	  public:
    	  nhanvien *next;
    	  void nhapds()
    	  {
    		 cout<<"\n + ma nhan vien:";	gets(manv);fflush(stdin);
    		 cout<<"\n +ho ten:";	gets(ten);fflush(stdin);
    		 cout<<"\n +diachi:";	gets(diachi);fflush(stdin);
    		 cout<<"\n +que quan:";	gets(quequan);fflush(stdin);
    		 cout<<"\n + nhap vao ngay thang nam sinh";
    		 ngaysinh.nhap();
    	  }
    	  void hienthi()
    	  { cout<<"\n +ma nhan vien:"<<manv;
    		 cout<<"\n +ho va ten: "<<ten;
    		 cout<<"\n +dia chi: "<<diachi;
    		 cout<<"\n +que quan: "<<quequan;
    		 ngaysinh.hienthinv();
    
    	  }
    	  int sau75()
    	  {
    		 if(ngaysinh.get_year()>1975)
    		  return 1;
    		  else
    		  return 0;
    	  }
    	};
    	void main()
    	{
    	char c;
    	  nhanvien *first=NULL;
    	  do{
    		  nhanvien *p=new nhanvien;
    		  p->nhapds(); fflush(stdin);
    		  if(first==NULL)
    			 first=p;
    		  else
    		  {
    			 p->next=first;
    			 first=p;
    		  }
    		  delete p;
    		 
    		 cout<<"\n ban co muon nhap nua ko(c|k)";
    		 c=getch();
    	  }while(c=='c'||c=='C');
    	 
    	  nhanvien *q;
    	  q=new nhanvien;
    	  q=first;
    
    	  while(q!=NULL)
    	  { if(q->sau75()==1)
    		 {
    			 q->hienthi();
    		 }
    		 q=q->next;
    
    	  }
    
    	  getch();
    	}

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Thấy ngay 1 lỗi là nhập xong thằng nào xoá luôn thằng đó (cái delete p đó) thì làm gì còn nữa để mà thao tác
    1 lỗi nhỏ nữa - tuy không ảnh hưởng đến kết quả - là gán q = new nhanvien rồi lại gán tiếp q = first ==> cái lệnh gán đầu là thừa và gây rò rỉ bộ nhớ.

    Ngoài ra bạn nên nói triệu chứng lúc chạy là thế nào (compile báo lỗi hay khi chạy báo lỗi hay chạy sai, báo lỗi thế nào sai thế nào..) thì người ta mới biết mà tập trung tìm lỗi phần đó chứ chẳng mấy người chịu ngồi đọc code từ đầu đến đuôi đâu nếu không phải ngó qua thấy ngay lỗi thì mình cũng đã chẳng giúp bạn được

  3. #3
    Ngày gia nhập
    04 2010
    Bài viết
    69

    Mình nghĩ sau mỗi vòng lặp thì lại mở ra con trỏ *p mới đến cuối vòng lặp mới xóa con trỏ *p đó đi...thì có vấn đề gì đâu. Khi mình compile nó báo lỗi ở phần con trỏ chỉ vào lớp date khi sử dụng nhân viên..Mặc dù đã nhập giá trị từ trước nhưng đến lúc in ra không có giá trị...nó bảo là overload...hic không biết sửa nó thế nào cả

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi kuhoang0512 Xem bài viết
    Mình nghĩ sau mỗi vòng lặp thì lại mở ra con trỏ *p mới đến cuối vòng lặp mới xóa con trỏ *p đó đi...thì có vấn đề gì đâu.
    Bạn thích dùng nó như giấy vs hoặc giấy ăn, xài 1 lần rồi bỏ thì cũng không có vấn đề gì thật nhưng mà sau đó bạn lại dùng lại nó thì lại có vấn đề đó. Cả danh sách của bạn đều toàn thành phần "dùng 1 lần rồi bỏ" thì cái danh sách đó là đồ bỏ, sao sau đó bạn lại tìm kiếm và hiển thị trên cái danh sách đồ bỏ đó vậy? (đoạn code while q)

    Trích dẫn Nguyên bản được gửi bởi kuhoang0512 Xem bài viết
    Khi mình compile nó báo lỗi ở phần con trỏ chỉ vào lớp date khi sử dụng nhân viên..Mặc dù đã nhập giá trị từ trước nhưng đến lúc in ra không có giá trị...nó bảo là overload...hic không biết sửa nó thế nào cả
    Chẳng hiểu ý bạn là thế nào? "Khi compile nó báo lỗi" tức là lỗi compile time, mà đã lỗi compile time thì không chạy được. Không chạy được thì nhập với in ra kiểu gì... tốt nhất bạn copy paste nguyên cái báo lỗi lên đi

  5. #5
    Ngày gia nhập
    04 2010
    Bài viết
    69

    a -858993460 int
    + this 0xcdcdce1d {day=??? month=??? year=??? } date * const
    đấy...còn nó không hiện rõ lỗi...thế thì mình sửa lại ngay bây h cái lỗi *p nhưng thực tình. Nó hiện lỗi ở cái khúc get_year ấy....=>this is the next statement that will be executed. To change which statement is executed next, drag the arrow. This may have unintended consequences

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Mặc định Vấn đề về sử dụng DSLK với các class trong C++

    Vậy lỗi đó của bạn là lỗi run-time do debugger báo (chứ không phải compiler)
    Và lỗi đó rất có khả năng là do truy cập vào vùng nhớ không hợp lệ, và nguyên nhân thì cũng rất có khả năng là do cái lỗi mình đã nói đó.
    Mình chờ kết quả chạy lại của bạn sau khi sửa (bỏ cái delete p đi)

  7. #7
    Ngày gia nhập
    04 2010
    Bài viết
    69

    vẫn thế cậu ah...không khá gì hơn

  8. #8
    Ngày gia nhập
    04 2010
    Bài viết
    69

    Ai giúp em bài này với...chỉ rõ cho em tránh lỗi này về sau hic...và cách nên như thế nào để lam dslk trong lập trình hướng đối tượng C++

  9. #9
    Ngày gia nhập
    08 2011
    Nơi ở
    /pentest
    Bài viết
    44

    @two friend: Bạn fbchicken đã tìm ra 2 lỗi là delete p;q=new nhanvien; còn một lỗi nữa khiến chương trình bị corrupt đó là trong vòng lặp while (q != NULL) thì có một điều là khi tạo danh sách thì danh sách đó chưa trỏ vào NULL nên q != NULL là gì compiler nó không hiểu nên nó bắt debug và stop chương trình như vậy nếu bạn sửa bằng cách cho p->next = NULL chương trình sẽ OK.

    C Code:
    1.       do{
    2.           nhanvien *p=new nhanvien;
    3.                   p->next = NULL; // this
    4.           p->nhapds(); fflush(stdin);

    Để cho rõ hơn bạn xóa bỏ delete p;q = new nhanvien; đi.

  10. #10
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi meterpreter Xem bài viết
    @two friend: Bạn fbchicken đã tìm ra 2 lỗi là delete p;q=new nhanvien; còn một lỗi nữa khiến chương trình bị corrupt đó là trong vòng lặp while (q != NULL) thì có một điều là khi tạo danh sách thì danh sách đó chưa trỏ vào NULL nên q != NULL là gì compiler nó không hiểu nên nó bắt debug và stop chương trình như vậy nếu bạn sửa bằng cách cho p->next = NULL chương trình sẽ OK.

    C Code:
    1.       do{
    2.           nhanvien *p=new nhanvien;
    3.                   p->next = NULL; // this
    4.           p->nhapds(); fflush(stdin);

    Để cho rõ hơn bạn xóa bỏ delete p;q = new nhanvien; đi.
    Đúng rồi, có sai sót này. Có thể sửa bằng cách đổi
    C Code:
    1.           if(first==NULL)
    2.              first=p;
    3.           else
    4.           {
    5.              p->next=first;
    6.              first=p;
    7.           }
    thành đơn giản:
    C Code:
    1.           p->next=first;
    2.           first=p;
    Đã được chỉnh sửa lần cuối bởi fbchicken : 27-09-2011 lúc 02:21 AM.

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

  1. Lỗi xóa DSLK sau khi xử lí DSLK trong hàm.
    Gửi bởi darkboys trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 6
    Bài viết cuối: 01-05-2013, 01:24 AM
  2. class bên trong 1 class và cấp phát bộ nhớ
    Gửi bởi hope2907 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 03-10-2011, 04:46 PM
  3. Chuyển từ DSLK đơn sang DSLK kép
    Gửi bởi thaihoa91 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 04-05-2011, 07:47 PM
  4. Code cài đặt DSLK đơn vòng và kép vòng trên C++. Thêm 1 phần tử sau 1 phần tử trong DSLK đơn/kép
    Gửi bởi hoanghieu.fit.hcmus trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 2
    Bài viết cuối: 09-04-2011, 02:54 PM
  5. Cách lấy giá trị biến từ class này sang class khác trong lập trình C#
    Gửi bởi phongk20 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 13-03-2011, 05:19 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