2013-05-10 2 views
0

if 문을 사용하여 일부 조건을 검사하는 프로그램을 작성 중입니다. 사실이라면 카운터를 증가시킵니다. 문제는 진술이 true가 되 자마자 변수가 끝없이 증가하거나 임의의 숫자로 증가한다는 것입니다. 이 문제와 관련된 코드의if 문을 깨는 것

if(res_vect_angle >=60 && res_vect_angle <=100 && left_mag_b >100) 
{ 

    //line(drawing, *iter_s, *(iter_s -1), Scalar(255, 255, 255), 2,8); 
    left_hook_count++; 
    cout<<"Left Hook:..........................!!! "<<left_hook_count<<endl; 

    if(left_hook_count++ == true) 
    { 
    break; 
    } 
} 

전체 덩어리 :

나는 조건을 충족하는 경우이 문 밖으로하지만 행운

내 코드와 함께 휴식을 몇 절을 사용하려고 한

float M1, M2; 
float A1, A2; 
double left_mag_a, left_mag_b; 
double res_vect_angle; 

int i = 0; 

    for(vector<Point>::iterator iter_lh = Leftarm.begin(); iter_lh != Leftarm.end(); ++iter_lh)  
    {  
     if(iter_lh->y <=240 && iter_lh->y >=60 && iter_lh->x >=340 && iter_lh->x <=680) 
     { 
      left_detect.push_back(*iter_lh); 

      if(i % 4 == 0) 
      { 
       if(left_detect.size()>4) 
        { 
         for(vector<Point>::iterator iter_s = left_detect.begin()+3; iter_s != left_detect.end(); ++iter_s, i++) 
         { 
          //Resultant Magnetude 
          M1 = pow((double) iter_s->x + (iter_s -2)->x,2); 
          M2 = pow((double) iter_s->y + (iter_s -2)->y,2); 

          left_mag_a = (M1 + M2); 

          left_mag_b = sqrt(left_mag_a); 

          //Resultant Angle 
          A1 = abs(iter_s->x - (iter_s -2)->x); 
          A2 = abs(iter_s->y - (iter_s -2)->y); 

          res_vect_angle = abs(atan2(A1,A2) * 180 /PI); 
          //cout<<"LEFT HOOK ANGLE IS: "<<res_vect_angle<<endl;       




          if(res_vect_angle >=60 && res_vect_angle <=100 && left_mag_b >100) 
          { 

           //line(drawing, *iter_s, *(iter_s -1), Scalar(255, 255, 255), 2,8); 
           left_hook_count++; 
           cout<<"Left Hook:..........................!!! "<<left_hook_count<<endl; 

           if(left_hook_count++ == true) 
           { 
            break; 
           } 
          } 




         } 

        } 
      } 
     } 

    } 

희망 사항은 ps에게 도움이됩니다. left_hook_count++;은 내 main() 맨 위에 선언 된 int 변수입니다.

+0

어디에서'left_hook_count'가 초기화 되었습니까? – Arthur

+2

'끝없이'? 어딘가에 고리가 있니? 그 코드도 게시 할 수 있습니까? – A4L

+1

'left_hook_count' 유형은 무엇입니까? 부울 유형이 아닌 경우 true로 비교하면 0과 같지 않은지 여부가 아니라 1과 같은지 검사합니다. 따라서 값이 2이면 루프에서 벗어날 수 없습니다. – hvd

답변

1

가장 좋은 솔루션은 테스트를 반전, 조건부 외부 if의 모든 나머지를 만들기 위해 아마도 :

if (whatever) { 
    // do some stuff 
    if (left_hook_count != true) { // or whatever the test should really be 
     // do some more stuff 
    } 
} 

당신은 프로그램이 외부 if 후 라벨이 goto을 사용하여 원하는 흐름을 얻을 수있는, 그러나 you don't want to.

반면에 이것은 루프에있는 것처럼 들리며 카운터가 증가한 경우 if 블록을 전혀 입력하지 않으시겠습니까? 이 경우 당신이 원하는 : 우리가 알아낼 수 있도록 자세한 정보를 제공 할 수

if(...) { 
    if(!left_hook_count++) { 
     // Do what you need to do 
    } 
} 
+0

하지만 goto를 사용하고 싶지는 않습니다. http://xkcd.com/292/ – ALOToverflow

+0

@ALOToverflow : 고마워요, 그게 내가 찾고 있던 것입니다. –

+0

'goto'에 대한 논쟁은 가난했습니다 .-) – Walter

0

당신은 단지 대신에서 휴식에 노력하는, 조건을 부정 할 수있는 경우 무슨 일이야.

초기화하지 않았을 수 있습니까? 과 처음 카운트 다시 unneccessariy 및 위해를 증가시킬 것이다 다시

if(left_hook_count++ == true) 

확인 (0 : 그것이 일어날 실 거예요)

을 나는 당신이 어떤 재귀 함수를 사용하여 다시 같아요. 따라서 Break 조건 (모든 테스트 케이스들)을 체크하십시오.

0

:

if (left_hook_count == 0 && whatever) { 
    // do some stuff 
} 
0

left_hook_count++true을 비교하지 마십시오. 이 문맥에서 true은 1과 같고 left_hook_count이 1을 초과하면이 테스트는 실패하고 코드는 결코 break에 도달하지 않습니다.

if 문에서 벗어나지 마십시오. 당신은 반복에서 빠져 나옵니다. 루프 내의 문에있는 break이이를 수행하는 한 가지 방법입니다.

+0

답장을 보내 주셔서 감사합니다 ..... 어떻게 내 코드에 솔루션을 구현 하시겠습니까 ....? 감사합니다 – Tomazi

+0

@ 토 마지 - 나는 당신의 실제 루프 종료 조건이 무엇인지 전혀 모르겠다. 그리고 나는 그 모든 코드를 이해하려고 시도 할 생각이 없다. 현재 테스트가 의미가 없다는 것은 명백합니다. 그 외에도 루프를 종료해야하는 조건을 명확하게 명시한 다음이를 수행하는 코드를 작성해야합니다. –

0

내 새 응답 :

:mylabel if (some_condition) 
{ 
    //code 
    if (some_condition) {break mylabel;} 
    //code 
} 

내 오랜 답변 : 마지막에 무조건 휴식을 포함하는 while 문으로 if 문을 교체합니다. (이전 답변은 문장 블록에 레이블을 붙이는 것을 배웠습니다.) 귀하의 경우에는

:

while(res_vect_angle >=60 && res_vect_angle <=100 && left_mag_b >100) 
{ 

    //line(drawing, *iter_s, *(iter_s -1), Scalar(255, 255, 255), 2,8); 
    left_hook_count++; 
    cout<<"Left Hook:..........................!!! "<<left_hook_count<<endl; 

    if(left_hook_count++ == true) 
    { 
     break; 
    } 
    break; //this unconditional break makes the while loop act as an if statement 
} 

당신이 그것을 가지고있는 점은 무엇 조건부 중단 이후 코드가없는 그러나 경우에? 나는 그 코드를 생략했다고 가정하고 있습니까? 당신이 썼던 방식으로 단순히 for 루프에서 벗어날 수 있습니다.

관련 문제