01/10/2018, 13:35

Lỗi push stack c++

Em làm bài tập lập trình C++ mô phỏng stack thì gặp 1 vấn đề khó hiểu mong anh chị giải thích hộ em!
khi em stack push từ 0-9 thì:
(1)

stack.push(i);//với i là con số  10 dòng


(2)

while(i< 10)
{
   stack.push(i);
   i++;
}

thì (1) ko có chuyện gì xảy ra hết,(2) thì lại có chuyện thông báo code dump? cho em hỏi thực sự chuyện gì đang xảy ra.
build trên ubuntu.
code main:

CStack stack(0);
 stack.Push(1);
 stack.Push(2);
 stack.Push(3);
 stack.Push(4);
 stack.Push(5);
 stack.Push(6);
 stack.Push(7);
 stack.Push(8);
 stack.Push(9);

 char i = 0;
 while(i < 10)
 {
  stack.Push(static_cast<int32_t>(i));
  ++i;
 } 
rogp10 viết 15:39 ngày 01/10/2018

Đó chỉ là code chạy, còn code cài đặt nữa.

明玉 viết 15:43 ngày 01/10/2018

Lỗi do code của bạn chứ đâu. Đưa implementation của Stack lên coi nào.

nghia viết 15:41 ngày 01/10/2018

Ham push

 void CStack::Push(const int32_t data)
 {
  this->stack[this->counter] = data;
  (this->counter)++;
 }

ham khoi tao: MAX 10

 CStack::CStack(int32_t data)
 {
  try{
     stack = new int32_t[MAX];
     counter = 1;
     stack[0] = data;
  }
  catch(bad_alloc&)
  {
   cout<<"ko the tao stack"<<endl;
  }
 } 

co gi may anh chi giup em.

rogp10 viết 15:47 ngày 01/10/2018

Dự là MAX = 10 cắm breakthru vào chỗ counter là ra ngay.

nghia viết 15:48 ngày 01/10/2018
  • Ko anh khi em chạy 10 và cho xuất giá trị stack[5] thì bình thường còn chạy vòng while là hiện hên code dump!
  • Còn counter có kiểu uint8_t thì em tự làm khó chính mình khi mà cout nó ra nó ra bảng mã ASCII.
明玉 viết 15:47 ngày 01/10/2018

Bạn đưa code lên đâu đó, ví dụ cpp.sh, rồi lấy link cho mọi người xem thử.

nghia viết 15:36 ngày 01/10/2018

Link:
main.cpp: https://ideone.com/G4LA8x
CStack.hpp: https://ideone.com/8XSWuY
CStack.cpp: https://ideone.com/l7CYPI

Khoa NTA viết 15:42 ngày 01/10/2018

Không biết mình có hiểu sai vấn đề hay không, nhưng mình thấy bạn đã đẩy 10 giá trị “bằng tay” vào trước nên dĩ nhiên stack đã đầy, rồi bạn lại đẩy thêm 10 giá trị bằng while thì nó báo segmentation fault là đúng rồi :v
Stack không thể “co dãn” mà cũng không kiểm tra full ở hàm Push nữa :v

rogp10 viết 15:42 ngày 01/10/2018

Hóa ra hai đoạn mã trên chạy liên tiếp mà ở trên thớt viết cứ như hai trường hợp khác nhau vậy.

Dark.Hades viết 15:44 ngày 01/10/2018

Try catch nên viết cả catch everythings (…) và log ra FUNCTION với LINE sẽ dễ debug hơn. Code C++ theo java là tốt nhất

Bài liên quan
0