초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 497

 
pako :

여기에 러시아어와 흰색으로 작성되었습니다. https://docs.mql4.com/en/basis/operators/for

https://docs.mql4.com/en/basis/variables/variable_scope

고맙지만 첫 번째 링크는 이전에 읽었고 두 번째 링크는 코드를 작성할 때 사용한 논리를 확인했습니다.

그러나 두 번째 링크의 이 진술은 "...   이 주기 외부에서 동일한 이름을 가진 다른 변수가 작동합니다 ... ", 동일한 이름을 가진 새 변수가 블록 내부에서 선언된다는 사실에도 불구하고 전역 변수의 값은 동일하게 유지됩니다. 그러나 이것은 말도 안되는 소리입니다. 왜냐하면 새 변수를 선언하면 이전 변수의 값을 덮어쓰게 되고 두 개의 다른 변수(로컬 및 전역)를 사용하고 저장하는 요점이 무엇인지 명확하지 않기 때문입니다. 같은 값?

 
-Aleks- :

고맙지만 첫 번째 링크는 이전에 읽었고 두 번째 링크는 코드를 작성할 때 사용한 논리를 확인했습니다.

그러나 두 번째 링크의 이 진술은 "...   이 주기 외부에서 동일한 이름을 가진 다른 변수가 작동합니다 ... ", 동일한 이름을 가진 새 변수가 블록 내부에서 선언된다는 사실에도 불구하고 전역 변수의 값은 동일하게 유지됩니다. 그러나 이것은 말도 안되는 소리입니다. 왜냐하면 새 변수를 선언하면 이전 변수의 값을 덮어쓰게 되고, 두 개의 다른 변수(로컬 및 전역)를 사용하고 저장하는 요점이 무엇인지 명확하지 않기 때문입니다. 값?

내 생각에 당신은 헛소리를 씁니다. 루프 내에서 로컬 변수를 선언하면 함수인지 여부에 관계없이 동일한 이름 의 전역 변수 값을 덮어쓰지 않지만 그대로 유지되지만 컴파일러는 로컬 변수를 선언했다는 경고를 표시합니다. 이미 존재하는 전역 변수와 이름이 같은 변수이고 범위에 새로 선언된 변수가 있는 함수 또는 코드 블록 내 작업은 전역 변수 값에 영향을 주지 않습니다. 이것은 새로운 변수라는 것을 이해하고 같은 이름으로 새 변수를 선언한 블록의 범위를 벗어난 후 전역 변수의 값이 변경될 것으로 예상하지 않도록 경고합니다. 기존 글로벌 기업으로.

간단한 방법으로: 아파트 내부에 있는 모든 것 - 모든 것이 모든 방에 적용되며 모든 방에서 아파트가 공유합니다(전역 변수). 그리고 방 안에 있는 모든 것은 방에만 속하며 다른 방에서는 볼 수 없습니다(이들은 로컬 변수입니다).

더 쉽게? 물론이죠:

화장실의 공기를 (로컬에서) 망쳐 놓았다면 거기에 버릇이 있습니다. 동시에 전체 아파트에서 (전 세계적으로) 화장실에 가지 않는 것이 더 낫다는 것을 알고 있습니다 (화장실 실험 결과) ... 그러나 공기는 아파트 전체에 대한 개념이며 모든 세입자는 알고 있습니다. 변기의 더러운 공기. 동시에 화장실에 있는 운이 좋은 사람만이 제한된 공간 내에서 로컬 상황을 변경하는 모든 즐거움(변수 값의 로컬 영향)을 충분히 경험할 수 있습니다. 다른 사람들은 그것에 대해 알고 있지만 느끼지 못합니다. 화장실을 나갈 때 화장실에서 경험한 감각(현지 가치)을 잃고 신선한 공기를 마시기 시작(세계 공기 가치를 얻음)하는 반면, 다른 사람들과 마찬가지로 밀고 나가는 데 발차기가 있음을 알면서( 감염 기능 공기의 결과, 전체 아파트의 삶의 전반적인 과정에 영향을 미침) ...

나는 내가 명확하게 설명했기를 바랍니다

 
Artyom Trishkin :

내 생각에 당신은 헛소리를 씁니다. 루프 내에서 로컬 변수를 선언하면 함수인지 여부에 관계없이 동일한 이름 의 전역 변수 값을 덮어쓰지 않지만 그대로 유지되지만 컴파일러는 로컬 변수를 선언했다는 경고를 표시합니다. 이미 존재하는 전역 변수와 이름이 같은 변수이고 범위에 새로 선언된 변수가 있는 함수 또는 코드 블록 내 작업은 전역 변수 값에 영향을 주지 않습니다. 이것은 새로운 변수라는 것을 이해하고 같은 이름으로 새 변수를 선언한 블록의 범위를 벗어난 후 전역 변수의 값이 변경될 것으로 예상하지 않도록 경고합니다. 기존 글로벌 기업으로.

간단한 방법으로: 아파트 내부에 있는 모든 것 - 모든 것이 모든 방에 적용되며 모든 방에서 아파트가 공유합니다(전역 변수). 그리고 방 안에 있는 모든 것은 방에만 속하며 다른 방에서는 볼 수 없습니다(이들은 로컬 변수입니다).

더 쉽게? 물론이죠:

화장실의 공기를 (로컬에서) 망쳐 놓았다면 거기에 버릇이 있습니다. 동시에 전체 아파트에서 (전 세계적으로) 화장실에 가지 않는 것이 더 낫다는 것을 알고 있습니다 (화장실 실험 결과) ... 그러나 공기는 아파트 전체에 대한 개념이며 모든 세입자는 알고 있습니다. 변기의 더러운 공기. 동시에 화장실에 있는 운이 좋은 사람만이 제한된 공간 내에서 로컬 상황을 변경하는 모든 즐거움(변수 값의 로컬 영향)을 충분히 경험할 수 있습니다. 다른 사람들은 그것에 대해 알고 있지만 느끼지 못합니다. 화장실을 나갈 때 화장실에서 경험한 감각(현지 가치)을 잃고 신선한 공기를 마시기 시작(세계 공기 가치를 얻음)하는 반면, 다른 사람들과 마찬가지로 밀고 나가는 데 발차기가 있음을 알면서( 감염 기능 공기의 결과, 전체 아파트의 삶의 전반적인 과정에 영향을 미침) ...

나는 내가 명확하게 설명했기를 바랍니다

그들은 그들의 작품에서 진실을 발견했습니다 - 감사합니다! 블록 내에서 전역 변수와 이름이 같은 변수를 선언하면 블록 안의 전역 변수에서 데이터가 차단된다는 사실이 밝혀졌습니다... 그리고 이미 선언된 변수에 대한 경고는 제거할 수 없다는 의미겠죠?
 
-Aleks- :
그들은 그들의 작품에서 진실을 발견했습니다 - 감사합니다! 블록 내에서 전역 변수와 이름이 같은 변수를 선언하면 블록 안의 전역 변수에서 데이터가 차단된다는 사실이 밝혀졌습니다... 그리고 이미 선언된 변수에 대한 경고는 제거할 수 없다는 의미겠죠?
그래서.
 
Artyom Trishkin :
 void CalculateLWMA( int rates_total, int prev_calculated, int begin, const double &price[])
  {
   int         i,limit;
   static int weightsum= 0 ;
   double      sum= 0 ;
//---
   if (prev_calculated== 0 )
     {
      limit=MA_Period+begin;
       //--- set empty value for first limit bars
       for (i= 0 ; i<limit; i++) LineBuffer[i]= 0.0 ;
       //--- calculate first visible value
       double firstValue= 0 ;
       for ( int i=begin; i<limit; i++)
        {
         int k=i-begin+ 1 ;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=( double )weightsum;
      LineBuffer[limit- 1 ]=firstValue;
     }
   else
     {
      limit=prev_calculated- 1 ;
     }
 
   for (i=limit;i<rates_total;i++)
     {
      sum= 0 ;
       for ( int j= 0 ; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }
설명서에 틀렸어요
 
-Aleks- :

고맙지만 첫 번째 링크는 이전에 읽었고 두 번째 링크는 코드를 작성할 때 사용한 논리를 확인했습니다.

그러나 두 번째 링크의 이 진술은 "...   이 주기 외부에서 동일한 이름을 가진 다른 변수가 작동합니다 ... ", 동일한 이름을 가진 새 변수가 블록 내부에서 선언된다는 사실에도 불구하고 전역 변수의 값은 동일하게 유지됩니다. 그러나 이것은 말도 안되는 소리입니다. 왜냐하면 새 변수를 선언하면 이전 변수의 값을 덮어쓰게 되고 두 개의 다른 변수(로컬 및 전역)를 사용하고 저장하는 요점이 무엇인지 명확하지 않기 때문입니다. 같은 값?

불행히도 철자가 잘못되었습니다 :(

 void CalculateLWMA( int rates_total, int prev_calculated, int begin, const double &price[])
  {
   int          i ,limit;
   static int weightsum= 0 ;
   double      sum= 0 ;
//---
   if (prev_calculated== 0 )
     {
      limit=MA_Period+begin;
       //--- set empty value for first limit bars
       for (i= 0 ; i<limit; i++) LineBuffer[i]= 0.0 ;
       //--- calculate first visible value
       double firstValue= 0 ;
       for ( int i =begin; i<limit; i++)
        {
         int k=i-begin+ 1 ;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=( double )weightsum;
      LineBuffer[limit- 1 ]=firstValue;
     }
   else
     {
      limit=prev_calculated- 1 ;
     }
 
   for ( i =limit;i<rates_total;i++)
     {
      sum= 0 ;
       for ( int j= 0 ; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }
 
pako :

불행히도 철자가 잘못되었습니다 :(

글쎄요. 결론은 문자로 할 수 있습니다. 그렇지 않으면 나는 여전히 박쥐에서 바로 코드를 인식할 수 없습니다.
 
pako :
메뉴얼이 틀려요
왜 나에게 코드를 제공합니까? 나는 그것에서 무엇을 찾아야하는지 이해하지 못합니다 ... 그리고 그것은 시간에 의해 제한됩니다. 이 모든 것이 무엇을 위한 것이며 도움말의 오류가 무엇인지 어떻게든 말할 수 있습니까?
 
Artyom Trishkin :
왜 나에게 코드를 제공합니까? 나는 그것에서 무엇을 찾아야하는지 이해하지 못합니다 ... 그리고 그것은 시간에 의해 제한됩니다. 이 모든 것이 무엇을 위한 것이며 도움말의 오류가 무엇인지 어떻게든 말할 수 있습니까?

이것은 도움말의 코드입니다.

선언은 함수 시작 부분에서 "i"입니다.

그런 다음 루프에서 "i"가 다시 선언됩니다.

 
pako :

이것은 도움말의 코드입니다.

선언은 함수 시작 부분에서 "i"입니다.

그런 다음 루프에서 "i"가 다시 선언됩니다.

글쎄요, 실수가 아닙니다. 전역 i 가 있는 루프(파란색)와 로컬 i 가 있는 또 다른 루프(빨간색)

 if (prev_calculated== 0 )
     {
      limit=MA_Period+begin;
       //--- set empty value for first limit bars
       for ( i = 0 ; i <limit; i ++) LineBuffer[ i ]= 0.0 ;
       //--- calculate first visible value
       double firstValue= 0 ;
       for ( int i =begin; i <limit; i ++)
         {                           
         int k= i -begin+ 1 ;           
         weightsum+=k;              
         firstValue+=k*price[ i ];    
         }                           
      firstValue/=( double )weightsum;
      LineBuffer[limit- 1 ]=firstValue;
     }
사유: