2011-12-18 5 views
-1

지난 2 시간 동안이 오류를 디버깅했습니다. 자러 가기 전에 도움을 요청하지 않으면 잠을 잘 수 없습니다. 내 게임에 모델 로더를 쓰고 있는데, 지금 당분간은 문자열을 분리하는 꽤 가벼운 방법을 사용하고 있습니다. 그러나, 거의 동일한 라인에서 작동하고, 무작위로하지 않습니다. string.substr()를 사용하고 있는데 오류가 문자열에 존재하지 않는 위치에서 시작하려고한다는 것을 의미한다고 생각합니다."std :: out_of_range"오류가 발생했습니다.

v1 = v1.substr(s.find(",")+1); 

하고 메시지를 인쇄 중단 점을 사용하여, 그것은 "1,1"를 사용하고 있습니다 정점 1

을 말한다 전체 문자열은 ": 호출 스택이 라인에서의 일어나는 말한다 173,1,1 175,1,1 174,1,1 "

여기서, 정점 1은 v1의 값이고, 문자열은 s의 값이다.

이 전체 기능입니다 :

FaceData data; 
s = s.substr(5); //remove "FACE " 
string v1, v2, v3; 

//vertex 1 
v1 = s.substr(0, s.find(" ")); 

data.vertexIndexes[0] = atoi(v1.substr(0, s.find(",")).c_str()); 
v1 = v1.substr(s.find(",")+1); 
data.textureIndexes[0] = atoi(v1.substr(0, s.find(",")).c_str()); 
v1 = v1.substr(s.find(",")+1); 
data.normalIndexes[0] = atoi(v1.c_str()); 

//vertex 2 
s = s.substr(s.find(" ")+1); 
v2 = s.substr(0, s.find(" ")); 

data.vertexIndexes[1] = atoi(v2.substr(0, s.find(",")).c_str()); 
v2 = v2.substr(s.find(",")+1); 
data.textureIndexes[1] = atoi(v2.substr(0, s.find(",")).c_str()); 
v2 = v2.substr(s.find(",")+1); 
data.normalIndexes[1] = atoi(v2.c_str()); 

//vertex 3 
s = s.substr(s.find(" ")+1); 
v3 = s; 

data.vertexIndexes[2] = atoi(v3.substr(0, s.find(",")).c_str()); 
v3 = v3.substr(s.find(",")+1); 
data.textureIndexes[2] = atoi(v3.substr(0, s.find(",")).c_str()); 
v3 = v3.substr(s.find(",")+1); 
data.normalIndexes[2] = atoi(v3.c_str()); 

return data; 

성병 : : 문자열 's'가 항상이 모양 함수에 전달되는 : "얼굴 X, X, XX, X, XX, X, X " 여기서 x는 숫자입니다.

이 내가 문자열을 분할 찾을 수있는 유일한 방법입니다

... 이제

는, 나는 여기에이 오류가 발생하는 이유는 거의 단지 무작위로 일어나는 것처럼 ... 그것은 보인다 이해하지 않습니다. 이

173,1,1 175,1,1 174,1,1

작동하지 않습니다 이유를 이해할 수 없다 그러나 그것은 작동합니다

175,2,2 176,2,2 175,2,2

+3

누군가가 문제를 발견하기 전에 더 많은 소스를 붙여야 할 것입니다. – sarnold

+5

[짧고 독립적 인 예제] (http://sscce.org)를 만들어보십시오. – Xeo

+1

여기서 추측 할 만하지만, 'hi'와 같은 문자열을 가지고 있다면,'+ 1'은'substr'을 잘못된 위치에서 시작하도록 요구할 것입니다. –

답변

5

귀하의 질문을 올바르게 해석하지 못 하겠지만 귀하가 제공 한 정보를 통해 귀하가하고있는 것으로 보입니다. :

세 개의 문자가 v1 유일한 유효 인덱스 [0,2] 사이이기 때문에이 경우
#include <string> 
#include <iostream> 

int main() { 
    std::string v1 = "1,1"; 
    std::string s = "173,1,1 175,1,1 174,1,1"; 

    try { 
     v1 = v1.substr(s.find(",")+1); 
    } 
    catch (const std::out_of_range& e) { 
     std::cout << "out_of_range: " << e.what() << std::endl; 
     return 1; 
    } 
    return 0; 
} 

6,, s.find(",")하지만, (s의 제 ,는 3 번 위치에있다) 3 반환한다. 3 또는 +14을 전달하면 v1의 범위를 벗어납니다.

+0

고마워, 나 아직도 무작위로 보이지만, 이것을 디버깅하는데 사용할 수있다. ... – smoth190

+1

최신 코드 샘플을 토대로, v1 대신에 ","를 찾는 이유를 살펴 보겠습니다. v1의 부분 문자열을 사용하고 있기 때문에 시작 문자를 검색하는 것이 해당 변수와 유사해야합니다. – DRH

+0

흠, 그거야! 오류를 뺀 동일한 결과를 생성합니다. – smoth190

관련 문제