2013-04-15 3 views
0

누군가가 말해 줄 수있는 GNU C++ 컴파일러분할 오류 벡터 반복자와 프로그램이 컴파일 및 Visual Studio에서 잘 실행되지만 컴파일 된 세그먼트 오류와 함께 실패하는 이유

내 인생이 알아낼 수 없습니다에 대한 . 나는 접두사/후위 연산자를 살펴보고 iterator가 조건문에 제대로 배치되었는지 확인했습니다 ... 무엇이 누락 되었습니까? 일반적으로 동적 배열 할당/할당 해제 작업을 할 때이 문제가 발생합니다. 여기서는 수행하지 않습니다.

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <random> 
#include <unordered_set> 

namespace std{ 
    template <> 
    struct hash<vector<int>> : public unary_function<vector<int>, size_t> 
    { 
     size_t operator()(const vector<int>& v) const 
     { 
      return v.size(); 
     } 
    }; 
} 

using namespace std; 

struct testCase{ 
    int n; 
    int m; 
    vector <int> wordVector; 
}; 

bool lexOrderConfirm(std::vector<int>::const_iterator, std::vector<int>::const_iterator, std::vector<int>::const_iterator, int); 

int main() {  

int t; 

cin>>t; 
vector <testCase*> testCaseVector(t); 

for (int i = 0; i < t; ++i){ 

    testCaseVector[i] = new testCase; 

    cin>>testCaseVector[i]->n; 
     cin>>testCaseVector[i]->m; 

} 




     for (int i = 0; i < t; ++i){ 


      std::unordered_set<std::vector<int>, std::hash<std::vector<int> > >permutations; 

      int permu = pow((double)testCaseVector[i]->n, testCaseVector[i]->m); 





int count = 0; 



     for (int z= 0; z < (permu*10); ++z){ 
     std::random_device rd; 

    std::default_random_engine randomeng(rd()); 
    int v; 
     for (int b = 0; b < testCaseVector[i]->m; ++b){ 
    v= randomeng() % testCaseVector[i]->n + 1; /*random number between 1 and n*/ 
    testCaseVector[i]->wordVector.push_back(v); 
     } 
     std::sort(testCaseVector[i]->wordVector.begin(), testCaseVector[i]->wordVector.end()); 

     permutations.insert(testCaseVector[i]->wordVector); 
     testCaseVector[i]->wordVector.clear(); 
     } 



     do { 

      vector <int> test = *permutations.begin(); 

     do { 
       std::vector<int>::const_iterator start = test.begin(); 
      std::vector<int>::const_iterator end; 

       end = test.end(); 

      std::vector<int>::const_iterator lastElem = start+(testCaseVector[i]->m-1); 


      if (lexOrderConfirm(start, end, lastElem, testCaseVector[i]->n)){ 
       ++count; 
      } 


     }while(std::next_permutation(test.begin(),test.end())); 

     permutations.erase(permutations.begin()); 
     test.clear(); 
     }while(!permutations.empty()); 







    count = count%100000007; 
     cout<<count<<endl; 



     } 
    return 0; 

} 


bool lexOrderConfirm(std::vector<int>::const_iterator start, std::vector<int>::const_iterator end, std::vector<int>::const_iterator lastElem, int N){ 
    bool confirmed = true; 

    for (std::vector<int>::const_iterator t = start; t != end; ++t){ 
       if ((2* (*t) > N)){ 


       } else if ((2*(*t) <= N) && (*(t+1) >= 2 * (*t)) && (t != (lastElem))){ 



       }else{ 
        confirmed = false; 
        break; 
       } 

    } 

    return confirmed; 
} 
+0

NULL로 포인터를 초기화 않기 때문에. 또한, 많은 상용구와 형식이 잘못된 코드를 게시했지만 디버거 또는 최소한 오류 메시지에서 추적을 제공하지 않았습니다. 이 경우 아무도 당신을 도울 수 없습니다. 귀하의 질문을 재 설계하십시오. –

답변

1

이유는 물론 초기화되지 않은 포인터를 역 참조하기 때문입니다. 한 가지만 사용자 입력에 의존하기 때문에 현재 코드에서 알 수 없습니다. t = 2으로 나를 위해 잘 실행되는 것 같습니다. 비록 그것이 예정대로 작동하는지 확실하지 않더라도.

왜 Visual Studio에서 실행됩니까?

VC++은 NULL 포인터를 초기화하지 않기 때문에. 초기화되지 않은 포인터가 가리키는 포인터가 초기화 된 포인터처럼 어떻게 든 작동하기 때문에 작동합니다. 그래서 기본적으로 정의되지 않은 동작입니다.

왜 컴파일 된 GNU C++ 컴파일러에서 세그먼트 화 오류로 실패합니까?

g++ 그렇지 않으면 당신이 문제가 자신을 요구하고, 당신은 ** ** std` 네임 스페이스 '로 사용자 정의 유형 또는 함수를 주입해서는 안