2011-08-11 6 views
1

나는 알아낼 수없는 매우 이상한 버그가 있습니다. 필자는 컴파일러가 내 진술을 재정렬하지 않는 한 코드의 작은 부분으로 좁혔습니다. 진술이 사실이 아니라고 생각합니다. 나는이 프로그램을 실행할 때매우 이상한 for for 루프 초기화

... 
std::cout << "here"<< std::endl; 
std::vector<int>::iterator n_iter; 
std::vector<int>::iterator l_iter; 
std::cout << "here?" << std::endl; 
for(n_iter = n.begin(), std::cout << "not here" ; std::cout << "or here" && n_iter < n.end(); n_iter++) 
{ 
    std::cout << "do i get to the n loop?"; 
    ... 
} 

, 나는 "여기"두 번째, 첫 번째 "여기"를 참조하십시오, 그러나 나는 "나 여기"출력을 "여기 없어"얻거나하지 않습니다. 그리고 확실히 "n loop에 도달합니까?"라는 질문을하지 않습니다.

이상한 일은 내 프로그램이 작동하고 있다는 것입니다. (거의 전체 CPU 코어를 사용하고 있습니다 ...),하지만 끝나지 않고 그냥 멈 춥니 다.

나는 clang ++ 및 g ++을 사용해 보았습니다. 최적화를 사용하지 않았습니다. armadillo와 함께 부스트 라이브러리가 설치되어 있고 boost_program_options 부분을 사용하고 있습니다. 하지만 컴파일러가 일을 재정렬해야한다고 생각하지 않습니다 ...

for 루프 선언 내에서 cout 호출을 사용하거나 사용하지 않고 발생하며 루프를 건너 뛰지 않습니다.

벡터 "n"은 1 이상의 길이를 가지며 boost_program_options 호출로 제공됩니다.

아이디어가 있으십니까?

+0

코드를 실행하고 예상대로 실행됩니다 (출력이'nothere 또는 heredo가 n 루프에 있습니까? 아니면 여기에 있습니다.). 이것은 아마 루프 안에서 또는 코드 상단의'... '에서 여러분이하고있는 일일 것입니다. –

+1

내 추측에 따르면 그 일은 '...'입니다. 그것은 괜찮을지도 모르지만 출력을 내 보내지 않고 무한 루프에 빠지기 때문에 보이지 않습니다. - 이런 이유로'cerr'을 디버그 출력에 사용하십시오. – UncleBens

답변

3

먼저 각 문자열 뒤에 std::endl을 출력해야합니다. 이것은 출력용 버퍼를 플러시합니다. (당신은하지 않았다 몇 가지 여분의 줄 바꿈이)

+0

이것은 ... 감사합니다. –

2

다음 프로그램 :

#include <string> 
#include <iostream> 
#include <vector> 

int main() { 
    std::vector<int> n; 
    n.push_back(3); 
    n.push_back(3); 
    n.push_back(3); 

    std::cout << "here"<< std::endl; 
    std::vector<int>::iterator n_iter; 
    std::vector<int>::iterator l_iter; 
    std::cout << "here?" << std::endl; 

    for(n_iter = n.begin(), std::cout << "not here\n" ; std::cout << "or here\n" && n_iter < n.end(); n_iter++) 
    { 
     std::cout << "do i get to the n loop?\n"; 
    } 
} 

다음과 같은 출력이 있습니다 이것은 당신이 기대하는 것으로 보인다

[5:02pm][[email protected] /tmp] make foo 
g++  foo.cc -o foo 
[5:02pm][[email protected] /tmp] ./foo 
here 
here? 
not here 
or here 
do i get to the n loop? 
or here 
do i get to the n loop? 
or here 
do i get to the n loop? 
or here 

를, 그래서 ' 끝 부분에 문제가있는 곳을 모르지만 건너 뛴 코드 일 수 있습니다.