Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 497

 
pako:

здесь русским по белому написано https://docs.mql4.com/ru/basis/operators/for

 

                                                    https://docs.mql4.com/ru/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;
     }
Причина обращения: