WHILE 연산자의 이상한 동작

 

모두들 안녕!

빌드 625에서 WHILE 동안 멈추는 EA(600 이전 빌드에서는 테스트한 적이 없지만 코드는 2년됨)가 있습니다.

사실은 WHILE이 시작될 때 표현식을 확인할 수 없는 것 같습니다. 결과는 절대 나오지 않습니다. 시작 기능 에 배치됩니다.

나는 무슨 일이 일어나는지 이해하기 위해 매우 간단한 EA를 시도했습니다.


 int counter= 0 , MaxCount = 10000 ; 

void start ()
  {
   while ( counter <= MaxCount )
   { Print ( "Counter " , counter);
   counter++;
   }
   return ;
  }

음, 첫 번째 카운터 값은 일반적으로 0이 아닌 9500 이상의 임의 값에서 시작합니다.

왜 그래? 어떠한 제안?

 

아마도 카운터는 EA 내부의 다른 곳에서 다른 값을 얻을 수 있습니다.

 void start()
  {
   int counter= 0 , MaxCount = 10000 ;
   while ( counter <= MaxCount )
   { Print ( "Counter " , counter);
   counter++;
   }
   return ;
  }
 
lord_hiro :

모두들 안녕!

빌드 625에서 WHILE 동안 멈추는 EA(600 이전 빌드에서는 테스트한 적이 없지만 코드는 2년됨)가 있습니다.

사실은 WHILE이 시작될 때 표현식을 확인할 수 없는 것처럼 보입니다. 결과는 절대 나오지 않습니다. 시작 기능에 배치됩니다.

나는 무슨 일이 일어나는지 이해하기 위해 매우 간단한 EA를 시도했습니다.

음, 첫 번째 카운터 값은 일반적으로 0이 아닌 9500 이상의 임의 값에서 시작합니다.

왜 그래? 어떠한 제안?

카운터가 정적임을 의미하는 전역으로 선언했습니다.

OnStart()의 코드, counter++는 카운터 값을 최대 10,000까지 푸시합니다.

따라서 정적이기 때문에 다음 틱에서 카운터는 처음부터 10,000입니다.

 
SDC :

카운터가 정적임을 의미하는 전역으로 선언했습니다.

OnStart()의 코드, counter++는 카운터 값을 최대 10,000까지 푸시합니다.

따라서 정적이기 때문에 다음 틱에서 카운터는 처음부터 10,000입니다.


그가 썼다:

영주히로 :

음, 첫 번째 카운터 값은 일반적으로 0이 아닌 9500 이상의 임의 값에서 시작합니다.

왜 그래? 어떠한 제안?


그래서 이것이 내 대답이다.


크졸 :

아마도 카운터는 EA 내부의 다른 곳에서 다른 값을 얻을 수 있습니다.

 void start()
  {
   int counter= 0 , MaxCount = 10000 ;
   while ( counter <= MaxCount )
   { Print ( "Counter " , counter);
   counter++;
   }
   return ;
  }
 
lord_hiro :

모두들 안녕!

빌드 625에서 WHILE 동안 멈추는 EA(600 이전 빌드에서는 테스트한 적이 없지만 코드는 2년됨)가 있습니다.

사실은 WHILE이 시작될 때 표현식을 확인할 수 없는 것 같습니다. 결과는 절대 나오지 않습니다. 시작 기능에 배치됩니다.

나는 무슨 일이 일어나는지 이해하기 위해 매우 간단한 EA를 시도했습니다.


음, 첫 번째 카운터 값은 일반적으로 0이 아닌 9500 이상의 임의 값에서 시작합니다.

왜 그래? 어떠한 제안?



이와 같은 빠른 루프를 따라갈 수 없는 전문가 탭을 보고 있을 가능성이 큽니다.

실제 로그 파일을 엽니다.

 

한 가지 말할 수 있는 것은, 코드의 다른 곳에서 카운터 변수를 다시 호출하고 값을 다시 10,001 미만으로 변경하지 않는 한 while 루프는 두 번째로 실행되지 않는다는 것입니다. 전역적으로 변수를 선언할 때는 주의해야 합니다.

 
lord_hiro : 음, 첫 번째 카운터 값은 일반적으로 0이 아닌 9500 이상의 임의 값에서 시작합니다. 왜 그런가요? 어떠한 제안?
빌드 이전에는 600개의 초기화되지 않은 변수가 0으로 초기화되었습니다. 이제 초기화하지 않는 임의의 값을 포함합니다.
 
그는 그것들을 초기화했습니다. 그것은 그 카운터 변수의 값을 변경하는 다른 것이어야 합니다...
 
GumRai가 말했듯이 로그는 그 속도를 처리할 수 없으며 실제 데이터의 대부분을 건너뛰고 일부 조각만 표시합니다.
 

GumRai, 당신 말이 맞습니다. 로그는 1부터 시작하는 모든 출력을 보고합니다.

OnStart() 내부 대신 전역 공간에 변수 선언을 넣는 것의 차이점은 첫 번째 경우 루프가 한 번 실행되고 두 번째 경우 무한 반복된다는 것입니다.

하지만... 카운트 사이클이 잘 실행되기 때문에 잘못된 디버깅 예제를 선택한 것이 분명합니다.

모든 것은 다음 EA에서 시작되었습니다.

코드는 다음과 같습니다.

 extern int SwingBarCount = 100;
 int start()



{

int SwingHighShift = 0 ;
string StringHighStatus = "False" ;
int SwingHigh = 0 ;


while (StringHighStatus == "False" || 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);
      }
       else
      {
      SwingHighShift++;
      }

   }

}}

명확성을 위해 관련이 없는 다른 코드를 제거 했으며 이전에 일부 중단점을 넣었기 때문에 WHILE까지 실행됩니다.

WHILE 조건이 true인 상태에서 시작하고 StringHighStatus가 true가 되거나 StringHighShift가 SwingBarCount에 도달할 때까지 IF ELSE를 순환해야 합니다.

내가 보는 것은 WHILE 뒤에 출력을 반환하지 않는 일련의 COMMENT 및 PRINT 명령이 있기 때문에 결코 끝나지 않는다는 것입니다.

StringHighStatus는 false로 유지될 수 있지만 카운터는 SwingBarCount에 도달해야 합니다.

작동하려면 다음과 같이 수정해야 했습니다.

 while (!EndCycle)
   {
   
   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);
      }
       else
      {
      SwingHighShift++;
      }
       if ( StringHighStatus == "True" ) EndCycle = TRUE ;
       if ( SwingHighShift > SwingBarCount ) EndCycle = TRUE ;
   }

나는 그것이 EndCycle을 처리하고 다른 조건은 처리하지 않는 이유를 이해하지 못합니다.

답변해 주셔서 감사합니다!

 
if ( StringHighStatus == "True" ) EndCycle = TRUE ;
else if ( SwingHighShift > SwingBarCount ) EndCycle = TRUE ;
다른 것을 포함 시키십시오.