2012-03-20 2 views
0

초보자 용 느낌이지만 느낄 수없는 것 같습니다. std :: vector의 항목을 반복하고 싶습니다. 그래서이 반복자를 사용하여 시도 끝에 시작하고 0으로 내 방식대로 일 : 나는 실제로 반대 순서대로 반복 할 것을 깨달았다, 그러나루프가 시스템 오류를 일으키는 경우 되돌리기

for (unsigned int i = 0; i < buffer.size(); i++) { 
    myclass* var = buffer.at(i); 
    [...] 
} 

: 현재 나는이 루프를 사용

for (unsigned int i = buffer.size()-1; i >= 0; i--) { 
    myclass* var = buffer.at(i); 
    [...] 
} 

그러나 단순히 오래된 줄을 새로운 줄 (물론 다시 컴파일)로 바꾸면 제대로 실행되지 않고 코드를 반복하면서 프로그램이이 줄에 처음 충돌 할 때 충돌을 일으키고, 이 오류와 함께 :

http://i43.tinypic.com/20sinlw.png

"[프로그램] 작동이 중지되었습니다."대화 상자가 이어집니다.

또한 Code : Blocks에 따라 프로그램이 종료 코드 3을 반환합니다 (this article이 믿어 진다면)는 ERROR_PATH_NOT_FOUND : 시스템이 지정된 파일을 찾을 수 없음을 의미합니다.

어떤 조언이 필요합니까? for 루프에 뭔가 빠져서 메모리 문제가 발생했을 수 있습니까? 반환 코드 3 또는 기사가 오해의 소지가 있으며 "경로를 찾을 수 없음"을 실제로 의미하지는 않습니까?

+0

우선, 디버거에서 실행 해 보셨습니까? 그것은 충돌의 정확한 위치를 정확히 찾아내는 데 도움이되며 변수를 검사하여 원인을 파악할 수 있습니다. 둘째, 두 번째 루프에서 크기가 0보다 큰가요? –

+0

'unsigned int' 인덱스로 -1에 액세스 할 수 있습니까? '2 ** 32-1'과 같이 더 많이 액세스하고 있습니다. – Kaz

+1

긴장을 풀고 이터레이터를 사용하십시오 ... –

답변

2

i == 0 때 (즉, 마지막 반복되어야 하는지를) unsigned int 대한 가능한 가장 큰 값으로 랩 어라운드하는 i 발생 i-- 감분한다. 따라서 루프를 멈추고 자 할지라도 조건 i >= 0이 여전히 유지됩니다. std::vector 정의 rbeginrend 방법이 있기 때문에 당신이 반복자를 사용할 수 있습니다, 또는

unsigned int i; 
unsigned int size = buffer.size(); 
for (unsigned int j = 0; j < size; j++) { 
    i = size - j - 1; 

:

는이 문제를 해결하려면, 당신은 원래 루프 논리를 유지하고 이런 식으로 뭔가를 시도하지만, 감소하는 i를 얻을 수 있습니다 :

for(typename std::vector<myclass *>::reverse_iterator i = buffer.rbegin(); i != rend(); ++i) 
{ 
    myclass* var = *i; 
    // ... 
} 

는 (작은 구문 오류가있을 수 있습니다 - 내가 편리한 컴파일러가없는)

3

부호없는 정수는 항상> = 0입니다. 또한 0에서 큰 숫자로 도약합니다.

+0

물론. 나는 그것을 어떻게 놓쳤는가? 그래서 문제는 단지 종류의 스택 오버 플로우입니까? 루프 광고 무한대를 통과하는 중입니다 ... 잠깐. 그것은 약 40 억까지 루핑하고 buffer.at (MAX_INT_VALUE * 2) (unsigned int 이후)는 메모리 오류를 일으키는 중입니다 ...그렇다면 최종 조건을 위해 무엇을 제안 하시겠습니까? –

+3

@drummerp'buffer'가 표준 컨테이너라면, 대신에'rbegin'과'rend'를 사용하는 역방향 반복자 같은 iterator를 사용할 수 있습니다. –

+0

@drummerp 그냥 int i 또는 long을 사용합니다. – Pepe

0
#include <vector> 

using namespace std; 

int main() { 
    vector<int> buffer = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    for (vector<int>::reverse_iterator it = buffer.rbegin(); it != buffer.rend(); it++) { 
     //do your stuff 
    } 
    return 0; 
} 
관련 문제