2012-12-25 3 views
1

안녕하세요, 내 programm을 실행할 때 문제가 있습니다. 예외가 내가 가지고 backtrack(params, set, results);C++ 벡터 이터레이터 호환되지 않음

전체 u는 모두 잘 작동 엑스 코드에서 맥 OS에이 링크 http://liveworkspace.org/code/MjgyND $ (7)

PS>에서 볼 수있는 코드 만, VS 2012 (Win7에)에 코드의이 부분에 "벡터가 호환되지 않는 이터레이터"이 이 오류는 ..

ps> liveworkspace에서 정상적으로 작동합니다. 컴파일러 설정을 수정해야 할 필요가 있습니까? 클래스 btNode 다른 DLL 및 템플릿 표준에 정의되어

int backtrack(btIData params, std::vector<float> set, std::vector<btNode> &results) 
{ 
    if (reject(params, set)) { 
     return 0; 
    } else { 
     accept(params, set, results); 
    } 

    set = first(params,set); 
    while((set.size() != 0) || reject(params, set)) { 
     backtrack(params, set, results); 
     set = right(params,set); 
    } 

    return 0; 
} 
+0

정확한 오류 메시지를 게시하십시오. 또한 오류의 정확한 행을 얻기 위해 코드를 디버그하려고 시도하십시오. – Zeta

+0

함수 호출에 사용하는 코드를 추가하십시오. –

+0

[SSCCE] (http://sscce.org/)에 문제를 제공하십시오. – Griwes

답변

1

에 살고있는 것 같다? 그렇다면 무엇을 찾았습니까? 그렇지 않다면 이것은 정확히 "디버그 내 코드"웹 사이트가 아닙니다.

어쨌든 응용 프로그램 영역에 대한 추가 지식 없이는 코드가 무엇을하는지 알아내는 것이 어렵습니다. 그리고 많은 컨테이너를 값으로 전달하기 때문에 디버깅하는 것이 쉽지 않습니다.

그러나 정식 오류는 매우 분명합니다. rightfirst 함수는 배열 params.input 배열보다 큰 크기로 set 배열 (backtrack) 증가합니다. 예 : params.input 배열의 크기가 5 (테스트 코드에서와 같이) 인 경우 set 배열의 크기는 6으로 커집니다.

두 기능에서이 조건

분명히 set 배열

int l = (int) candiates.size(); // `candiates` is `set` 
if (l > params.input.size()) 
    // Don't grow array 
else 
    // Grow array 

의 성장을 제한하기로되어 있지만 어떤 이유로 엄격한 비교 l > params.input.size() 대신 비 엄격한 하나 l >= params.input.size()을 사용 하였다. 이것은 params.input5 요소 만있는 경우 set 배열이 6 크기로 자랄 수있는 것입니다.

그런 다음 나중에 getPathSummary에서 당신은 0에서 범위와 충돌하는 프로그램에서 갈 수있는 인덱스의 원인 sets.size() - 1

float getPathSummary(btIData params, std::vector<float> sets) 
{ 
    float summary = 0; 
    for (int i =0; i < sets.size(); i++) { 
     summary += params.input[i] * sets[i]; 
    } 

    return summary; 
} 

에 인덱스 값으로 input 배열을 반복. 나는. 존재하지 않는 params.input[5]에 액세스하려고 시도했습니다.

아웃 바운드 액세스 시도는 표준 라이브러리의 다른 디버그 구현에서 다른 런타임 오류를 생성합니다. 귀하의 경우에는 "incompatible iterators"에 관한 것이 었습니다.

P. 무거운 데이터 구조를 값으로 전달하지 마라. 참조를 사용하십시오.

+0

getIterationData <-이 함수는 근음 값을 0으로 추가합니다. – user1920358

+0

@ user1920358 : 그래서? 원래'input'은 크기가'4'입니다. 'getIterationData'는'input' 크기가'5' 인'0' 값을 추가합니다. 나중에,'set'은 크기가'6'이됩니다 (앞에서 설명했듯이). 그리고 나서'getPathSummary'의 순환은'6'이'5' 이상이기 때문에 (앞에서 설명한 것처럼) 충돌합니다. – AnT

+0

네 말이 맞아, 나는 조심하지 않아; – user1920358

0

경우 : 벡터가 DLL에 intanciated됩니다, 당신은 당신의 코드를 작성하는 데 사용되는 표준 라이브러리의 버전과 사용 된에 따라 호환성 문제가있을 수 있습니다 외부 DLL을 빌드합니다.

그러나 귀하의 경우 모든 것을에서

당신은 디버거를 사용하려고 않았 음 같은 파일