2012-11-01 4 views
1

런타임 오류가 발생하는 문제가 발생했습니다. 코드를 디버깅하기 위해 일부 cout 문에서 코드가 제대로 실행되는 마지막 위치를 찾기 위해 throw했습니다. 출력을 기반으로 while 문이 while 조건이 false로 평가 될 때 중단되는 것처럼 보이지만 가능한 방법을 볼 수 없습니다.C++ while 루프가 거짓 조건에서 종료되지 않음

VAR 선언 : 여기에 코드입니다

queue<string> newOrder; 
stack< vector<char> > opStack; 
char symbol; 

물건 즉 스택과 큐를 채우는 일이,이 코드는 도달 :

is stack empty?:0 
popped stack; 
is stack empty?:1 
RUN FAILED (exit value 1, total time: 1s) 
:이 출력입니다

while(opStack.empty()==false){ 
    if(opStack.top()[1] != 'L'){ 
     cout<<"is stack empty?:"<<opStack.empty()<<endl; 
     symbol = opStack.top()[0]; 
     newOrder.push(symbol); 
     opStack.pop(); 
     cout<<"popped stack;"<<endl; 
     cout<<"is stack empty?:"<<opStack.empty()<<endl; 
    } 
    else{ 
     break; 
    } 
} 
cout<<"made it out of while loop"; 

if(opStack.top()[1] == 'L'){  
    opStack.pop(); 
} 
else{ 
    errorEncountered = true; 
} 

따라서 출력에 따라 스택은 루프 끝에서 비어 있습니다. while 루프 조건을 false로 설정해야하지만 while 루프가 종료되기 전에 프로그램이 실패합니다. 그게 어떻게 가능할까요? 스택이 작동하는 방식과 관련이 있습니까?

+0

@casperOne 안녕하십시오 : cout을 내 원래하지만 제대로 형식의 질문에 플러시 점점되지 않았 음을 지적 @interjay하는

감사 (if(opStack.empty()==false){//second if-else set} 내부 지난 경우-else 문을 넣어 그것을 해결) 기분을 상하게하지 마라. 그러나 나는 여기의 로프를 배우고있다. 그리고 나는 당신이 나의 질문을 "진짜가 아니다라고 생각하는 이유를 명확히하지 않는다." 내가 게시하기 전에 몇 시간 동안 사냥했다는 질문은 "왜 while 루프가 false로 평가 될 때 루프가 종료되지 않습니까?"라고 말한 웹에는 아무도 없었습니다. "디버깅하는 방법을 한눈에 살펴보고, 특히 당신이 당신의 산출물을 어떻게 만들어 내고 있는지 "정말 내가 찾고있는 대답이었습니다. - 그것에 대해 "모호하고, 모호하고, 불완전하며, 광범위하거나, 수사적 인"것이 무엇이며, 왜 "현재의 형태로 합리적으로 대답 할 수 없습니까?" – Wadsworth

답변

3

while 루프는 거짓 조건에서 종료됩니다. 제대로 디버깅을하지 않아서 코드의 잘못된 부분에 집중하게되었습니다.

문제는 실제로 마지막 cout 이후에 발생합니다. 그 이후의 명령문 인 if(opStack.top()[1] == 'L'){은 빈 스택에서 최상위 항목을 가져 오려고 시도하고 실행을 실패하게 만듭니다.

출력에서 ​​"while it out while loop"를 보지 못했기 때문에 어떻게 가능합니까? 프로그램이 충돌하기 전에 마지막 cout이 출력으로 플러시되지 않기 때문입니다. 나는 마지막 한마디에 <<endl을 추가했다. 그리고 그것은 트릭을했다. "while it while while loop"가 표시되어 프로그램의 실제 문제를 정확하게 지적 할 수있었습니다. , c++ while loop condition isn't playing nice with stack.empty())

+0

선생님,이 일이 며칠 동안 나를 힘들게했습니다. 답을 찾은 것을 기쁘게 생각합니다. – WhozCraig

+0

나도 그렇다. 나에게는 며칠 동안 완전한 악몽이었다. 스택 오버 플로우시 좋은 사람들에게 감사드립니다. – Wadsworth

+0

그리고 버퍼가 버퍼링되지 않기 때문에 디버깅을 위해 항상 'cerr'을 사용하는 것이 좋습니다! –

관련 문제