2013-10-15 2 views
1

я получаю ошибку ошибки сегментации в моем кодеЯ получаю Segmentation Fault с моим Циклы

Заголовок

#ifndef DUALSTK 
    #define DUALSTK 

    #include <deque> 

    using namespace std; 

    enum stackNumber {One, Two}; 


    template <typename T> 
    class dualStack { 
     public: 
     // constructor. set counts to 0 
      dualStack() : dualStackElements(20, 0) {} 

      void push(const T& item, stackNumber n); 
      void pop(stackNumber n); 

      T& top(stackNumber n); 
      //const T& top(stackNumber n) const; 

      bool empty(stackNumber n) const; 
      int size(stackNumber n) const; 

      int getCount1() const {return count1;} 
      int getCount2() const {return count2;} 

     private: 
      deque<T> dualStackElements; 
      int count1, count2; 
    }; 

    #endif // DUALSTK 

main.cpp

#include <iostream> 
    #include <deque> 
    #include "dualstk.h" 

    using namespace std; 

    template <typename T> 
    T& dualStack<T>::top(stackNumber n) { 
     int num = 0; 
     if (n == 0) { 
      num = count1 - 1; 
      return num; 
     } 

     if (n == 1) { 
      num = 20 - count2; 
      return num; 
     } 
    } 


    template <typename T> 
    void dualStack<T>::push(const T& item, stackNumber n) { 
     if (n == 0) { 
      count1++; 
      dualStackElements[top(One)] = item; 
     } 

     if (n == 1) { 
      count2++; 
      dualStackElements[top(Two)] = item; 
     } 
    } 

    template <typename T> 
    void dualStack<T>::pop(stackNumber n) { 
     int item = 0; 
     int item2 = 0; 
     if (n == 0) { 
      item = dualStackElements[top(One)]; 
      cout << item << " "; 
      count1--; 
     } 

     if (n == 1) { 
      item2 = dualStackElements[top(Two)]; 
      cout << item2 << " "; 
      count2--; 
     } 
    } 

    template <typename T> 
    bool dualStack<T>::empty(stackNumber n) const { 

return 1; 
    } 



    int main() { 

     dualStack<int> stack; 

     for(int i = 1; i < 21; i++) { 
      if(i % 2 == 0) { 
       stack.push(i, One); 
      } 
      else { 
       cout << i; 
       stack.push(i, Two); 
      } 
     } 

     cout << endl; 


     for (int j = 0; j < 10; j++) 
      stack.pop(One); 

     cout << endl; 

     for (int i = 0; i < 10; i++) 
      stack.pop(Two); 

     cout << endl; 

     cout << stack.getCount2(); 
     cout << stack.getCount1(); 

     cout << endl; 


     cout << "\n" << stack.top(One); 
     cout << stack.top(Two) << endl; 

     return 0; 
    } 

Всякий раз, когда у меня есть один цикл для моего stack.pop он будет работать нормально , но если я делаю цикл for сразу после того, как я использую его для выполнения stack.pop, он не будет работать

Я не уверен, что я сделал неправильно к этому

 for (int j = 0; j < 10; j++) 
      stack.pop(One); 


     for (int i = 0; i < 10; i++) 
      stack.pop(Two); 
+0

Обратите внимание, что для того, чтобы сделать шаблон полезным, он должен быть полностью объявлен (включенный элемент функции) в вашем заголовке. –

+0

Я пропал без вести, чтобы шаблон не был полезен? @AlexisWilke – UnhinderedLimpidity

ответ

0

Я думаю, вы непонимание, что это делает (или я неправильно понял ваш код):

dualStackElements[top(One)] = item; 

вы не объявили массив dualStackElements

Лучше объявить вместо этого два обхода.

deque<T> dualStackElementsOne; 
deque<T> dualStackElementsTwo; 
+0

Нет. myDeque [n] дает вам элемент n в deque. http://www.cplusplus.com/reference/deque/deque/operator[]/ – Raja

0

Ваш метод Top требует некоторой проверки ошибок. Что делать, если count1 равно 0 (или count2> 20)? Вы должны вернуть отрицательное значение, а затем использовать его как индекс для своего дека. И удалите возврат по ссылке!

1

Функция top() возвращает ссылку на локальную переменную 'num'. Его хранилище находится в стеке, поэтому значение будет изменено, когда функция вернется, а затем вы будете использовать его как индекс в dualStackElements. Это может привести к доступу к неверному адресу памяти.

+0

Я не уверен, что мне нужно сделать, чтобы исправить это. любой совет? @tristan – UnhinderedLimpidity

+0

в вашем случае функция возвращает a & T, а не int. Но вы ожидаете, что int? Поскольку он используется для индексации deque ... Если вы действительно хотите int, вы можете просто вернуть int вместо ссылки? – tristan

0
  1. метод top() возвращает ссылку на локальную переменную num, освобожденную после вызова метода. Но разные ОС имеют разные ограничения на доступ к нелегальной памяти, иногда это нормально в Linux.

  2. В вашем конструкторе нет операций инициализации для полей: count1, count2. Программа всегда возвращает «Ошибка сегментации»; если я прокомментирую «count1 = count2 = 0;» в моем модифицированном конструкторе.

  3. Чтобы получить стабильный результат для программы, вы должны сделать чистую перед make. Я не знаю точно, почему, но это произошло в моем тестовом прогоне.