2013-10-15 2 views
1

루프 얻고나는 나의 들어있는 분할 오류가 내 코드에서 분할 오류 오류가 계속

헤더

#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 잘 작동합니다. 하지만 stack.pop 할 일을 사용 후 바로 for 루프 할 경우 작동하지 않습니다

나는 내가 당신이 무엇을 오해 생각이

 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의 배열을 선언하지 않은

dualStackElements[top(One)] = item; 

대신 두 개의 대기열에서 제외를 선언하는 것이 좋습니다.

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

아니요. myDeque [n]은 양키에서 n 요소를 제공합니다. http://www.cplusplus.com/reference/deque/deque/operator[]/ – Raja

0

귀하의 Top 방법은 몇 가지 오류 검사를 필요로한다. count1이 0 (또는 count2> 20) 인 경우는 어떻게됩니까? 음수 값을 반환 한 다음 양면 비아에 대한 인덱스로 사용합니다. 참조로 반품을 취소하십시오!

1

function top()은 지역 변수 'num'에 대한 참조를 반환합니다. 저장 장치가 스택에 있으므로 함수가 반환 될 때 값이 수정 된 다음이를 dualStackElements의 인덱스로 사용합니다. 이로 인해 유효하지 않은 메모리 주소에 액세스 할 수 있습니다.

+0

이 문제를 해결하기 위해 내가해야 할 일이 확실하지 않습니다. 어떤 조언? @ tristan – UnhinderedLimpidity

+0

귀하의 경우 함수는 int가 아닌 & T를 반환합니다. 하지만 int를 기대합니까? deque를 인덱스하는 데 사용되는 것처럼 ... int를 원한다면 참조 대신 int를 반환 할 수 있습니까? – tristan

0
  1. top() 메서드는 메서드 호출 후에 해제 된 로컬 변수 num에 대한 참조를 반환합니다. 하지만 다른 OS는 불법적 인 메모리 액세스에 대해 다른 제한을 가지고 있습니다. 때로는 Linux에서는 정상입니다.

  2. 생성자에서 필드의 초기화 작업은 count1, count2가 아닙니다. 프로그램은 항상 "Segmentation fault;"를 반환합니다. 내가 "count1 = count2 = 0;"이라고 말하면 내 수정 된 생성자에서.

  3. 프로그램에 안정적인 결과를 얻으려면 make 전에 정리해야합니다. 왜 그런지는 정확히 알지 못하지만 테스트를 통과 할 때 일어났습니다.