WHILE 연산자의 이상한 동작 - 페이지 2

 

그것은 차이가 없다고 생각합니다. IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE;

요점은 IF가 종료 조건을 감지한 다음 WHILE이 bool 변수에 반응하는 반면 WHILE 내부에 동일한 조건을 넣으면 끝나지 않는 이유입니다.

 
lord_hiro :

그것은 차이가 없다고 생각합니다. IF( StringHighStatus == "True" || SwingHighShift > SwingBarcount ) EndCycle = TRUE;

요점은 IF가 종료 조건을 감지한 다음 WHILE이 bool 변수에 반응하는 반면 WHILE 내부에 동일한 조건을 넣으면 끝나지 않는 이유입니다.


나에게 이것은 작동하는 것 같다

 while (StringHighStatus == "False" && SwingHighShift <= SwingBarCount)

~처럼

 while (!EndCycle)
   {
   
  ...
       if ( StringHighStatus == "True" ) EndCycle = TRUE ;
       if ( SwingHighShift > SwingBarCount ) EndCycle = TRUE ;
   }
 
예, 때때로 논리를 반대로 하면 우리가 달성하고자 하는 것을 얻을 수 있습니다.
 

deVries, 어쩌면 내가 틀렸을 수도 있지만 논리적 OR이 하는 것처럼 IF 시퀀스가 부울을 TRUE로 바꾼다고 생각합니다.

첫 번째 조건이 일치하면 EndCycle이 TRUE로 바뀌고 두 번째 조건이 일치하지 않으면 TRUE로 유지됩니다.

그 반대의 경우 첫 번째는 충족되지 않고 두 번째는 충족되면 TRUE가 됩니다.

이때 WHILE은 종료 조건을 인식합니다.

따라서 시퀀스의 두 IF는 논리적 OR처럼 동작하고 IF...ELSE IF 시퀀스도 동일합니다.

그리고 그것은 OR이어야 하고 AND가 될 수 없습니다. 그렇지 않으면 WHILE이 멈출 수 있습니다(문자열의 조건은 무한정 거짓일 수 있음).

WHILE이 주기 내에서 값이 설정된 단일 부울 변수를 관리하는 반면 조건 정의 내에서 동일한 논리적 OR 연산의 결과를 결정할 수 없는 이유는 무엇입니까?

이 EA는 과거에 빌드 600 이전, 500 이전에도 많은 사람들이 사용했으며 이것이 마지막 릴리스입니다. 아무도 불평하지 않았습니다.

그래서 제 질문은: 빌드 600 후에 WHILE 연산자로 문제를 겪고 있는 사람이 있습니까?

 
대답은 예입니다.... 그러나 빌드와 관련이 없고 코딩과 많은 관련이 있을 수 있습니다....ㅋㅋㅋ
 
So my question is : is there anyone experiencing troubles with the WHILE operator after build 600 ? 
묻지 않고 제대로 작동하는지 확인하기 위해 매우 기본적인 동안 논리 연산을 시도한 적이 있습니까?
 
lord_hiro :

deVries, 어쩌면 내가 틀렸을 수도 있지만 논리적 OR이 하는 것처럼 IF 시퀀스가 부울을 TRUE로 바꾼다고 생각합니다.

첫 번째 조건이 일치하면 EndCycle이 TRUE로 바뀌고 두 번째 조건이 일치하지 않으면 TRUE로 유지됩니다.

그 반대의 경우 첫 번째는 충족되지 않고 두 번째는 충족되면 TRUE가 됩니다.

이때 WHILE은 종료 조건을 인식합니다.

따라서 시퀀스의 두 IF는 논리적 OR처럼 동작하고 IF...ELSE IF 시퀀스도 동일합니다.

그리고 그것은 OR이어야 하고 AND가 될 수 없습니다. 그렇지 않으면 WHILE이 멈출 수 있습니다(문자열의 조건은 무한정 거짓일 수 있음).

WHILE이 주기 내에서 값이 설정된 단일 부울 변수를 관리하는 반면 조건 정의 내에서 동일한 논리적 OR 연산의 결과를 결정할 수 없는 이유는 무엇입니까?

이 EA는 과거에 빌드 600 이전, 500 이전에도 많은 사람들이 사용했으며 이것이 마지막 릴리스입니다. 아무도 불평하지 않았습니다.

그래서 제 질문은: 빌드 600 후에 WHILE 연산자로 문제를 겪고 있는 사람이 있습니까?

나는 당신이 이것을 언급하고 있다고 생각합니다

 while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount)

게시한 코드가 빌드에서 예상한 대로 수행되지 않은 경우 코드를 변경해야 합니다.

   while (StringHighStatus== "False" || SwingHighShift<=SwingBarCount)
     {

       if ( iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)== iHigh ( NULL , 0 ,SwingHighShift) && iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)> Close [ 0 ])
        {
         //IF THIS CONDITION IS TRUE AT, FOR EXAMPLE SwingHighShift=10
         StringHighStatus= "True" ;
         SwingHigh=SwingHighShift;
         ObjectDelete ( "SwingHigh" );
         ObjectCreate ( "SwingHigh" , OBJ_VLINE , 0 , Time [SwingHigh], 0 );
         ObjectSet ( "SwingHigh" , OBJPROP_COLOR ,Red);
         //THEN StringHighStatus="True" BUT SwingHighShift IS NOT INCREASED IN THIS BLOCK OF CODE
         //SO WHEN CONTROL IS HANDED BACK TO THE WHILE OPERATOR, SwingHighShift WILL REMAIN UNCHANGED AT 10
         //SO THIS BLOCK OF CODE WILL BE REPEATED OVER AND OVER CHECKING BAR SHIFT 10, BECAUSE THERE IS NO WAY OUT!
         //HOW TO RESOLVE? SIMPLY USE         
         break ;
        }
       else
        {
         SwingHighShift++;
        }

     }
 
deysmacro :
묻지 않고 제대로 작동하는지 확인하기 위해 매우 기본적인 동안 논리 연산을 시도한 적이 있습니까?


내 게시물은 지금 논의 중인 EA 덩어리와 매우 유사한 비정상적인 동작을 반환하는 것처럼 보이는 WHILE의 예에서 시작되었으므로 먼저 시도한 다음 질문했습니다.

아주 간단한 디버깅에 대한 내 해석이 잘못된 것으로 판명되어 논의가 EA 자체로 옮겨졌습니다.

 

기다려 주셔서 감사합니다.

제가 틀릴 수도 있고 머리가 좋지 않을 수도 있지만 논리를 이해할 수 없습니다 ...

첫 번째 IF가 제안한 대로 SwinghHighShift=10에서 문자열이 "true"로 바뀌면 해당 주기에서 카운트가 증가하지 않습니다. 그 후 컨트롤 은 WHILE로 돌아갑니다. WHILE에는 논리적 OR이 포함되어 있고 조건 중 하나가 충족되기 때문에 주기는 이 지점에서 끝나야 합니다.

반대로 변수가 false로 유지되면 카운터는 최대값에 도달해야 하며 다시 종료 조건을 갖게 됩니다.

나는 당신의 고려가 AND 연산자에 대해 사실일 것이라고 생각합니다.

귀하의 해석에 따라 WHILE 내부의 OR을 건너뛸 수 있습니다. 문자열에 첫 번째 IF 조건을 넣을 수 있습니다. "true"로 바뀌면 중단이 WHILE을 종료하고, 그렇지 않으면 카운터가 최대값까지 계속됩니다.

코드는 다음과 같이 바뀝니다.

   while (SwingHighShift<=SwingBarCount)
     {

       if ( iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)== iHigh ( NULL , 0 ,SwingHighShift) && iFractals ( NULL , 0 , MODE_UPPER ,SwingHighShift)> Close [ 0 ])
        {
         
         StringHighStatus= "True" ;
         SwingHigh=SwingHighShift;
         ObjectDelete ( "SwingHigh" );
         ObjectCreate ( "SwingHigh" , OBJ_VLINE , 0 , Time [SwingHigh], 0 );
         ObjectSet ( "SwingHigh" , OBJPROP_COLOR ,Red);
        
         break ;
        }
       else
        {
         SwingHighShift++;
        }

     }


그러나 이것은 여전히 해결 방법이며 슬프게도 WHILE이 OR을 처리하지 않는 이유를 (나에게) 설명하지 않습니다.

 
lord_hiro :


첫 번째 IF가 제안한 대로 SwinghHighShift=10에서 문자열이 "true"로 바뀌면 해당 주기에서 카운트가 증가하지 않습니다. 그 후 컨트롤은 WHILE로 돌아갑니다. WHILE에는 논리적 OR이 포함되어 있고 조건 중 하나가 충족되기 때문에 주기는 이 지점에서 끝나야 합니다.

예, while 조건 중 하나가 충족되지만 이 경우 코드가 종료되지 않고 for로 이동하여 무한 루프에 있습니다.