Урок №8: Локальные и глобальные переменные

На одном из прошлых уроков мы узнали, что функции позволяют разделить программу на небольшие легко управляемые части. Все функции, используемые вами до настоящего момента, были достаточно простые. Как только вашим функциям потребуется выполнить более сложную работу, они должны будут использовать переменные для реализации своих задач. Переменные, которые объявляются внутри функции, называются локальными переменными. Факт того, что локальные переменные существуют, известны только  функции, в которой они объявлены.

Наиболее важно понять то, что локальные переменные существуют только в блоке кода, в котором они объявлены. Таким образом, локальные переменные создаются при входе в блок и уничтожаются при выходе из него.

Наиболее типичным блоком кода, в котором объявляются локальные переменные, является функция. Например, рассмотрим две функции:

//+------------------------------------------------------------------+
//| Expert function                                                  |
//+------------------------------------------------------------------+
void func1()
{
   int x;
   x= 10;
)

//+------------------------------------------------------------------+
//| Expert function                                                  |
//+------------------------------------------------------------------+
void func2()
{
   int x;
   x = -199;
}

Целочисленная переменная «x» объявляется дважды: один раз в func1() и другой раз в func2().  Переменная «х» в func1() не имеет отношения к «х» в func2(), поскольку каждая «х» известна только в блоке, где произошло объявление переменной.

В дополнение к локальным переменным язык программирования MQL позволяет вашим программам объявлять глобальные переменные, которые известны на протяжении всей программы (глобально для всех функций). Чтобы объявить глобальную переменную, следует просто поместить объявление переменной в начало вашей программы вне какой-либо функции:

int some_global_variable; // —> Объявление глобальной переменной

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // Здесь должны быть операторы программы
}

Следует с осторожностью создавать и пользоваться глобальными переменными, поскольку любая функция может изменить значение глобальной переменной и достаточно сложно отследить все функции, которые потенциально могли бы изменить данную переменную.

Локальные и глобальные переменные

 

Ключевое слово «extern» используется для объявления переменных специального вида (не типа, а вида). Переменные такого вида используются для хранения входных данных программы, которые Вы можете ввести в окошке настроек Вашего советника или индикатора.
Пример:

//--- Внешние переменные (глобальные переменные) 
extern string          MM              = "Money management";
extern double          Lots            = 0.1;
extern int             SL              = 70;
extern int             TP              = 130;
extern int             Magic           = 123;

Аналогично extern язык MQL представляет ключевое слово input, оно также определяет внешнюю переменную, но изменять значение переменной с модификатором input внутри программы нельзя, такие переменные доступны только для чтения. Изменять значения input-переменных может только пользователь из окна свойств программы. Внешние переменные всегда переинициализируются непосредственно перед вызовом OnInit().

Пример:

//--- Внешние переменные (глобальные переменные)
input string          MM              = "Money management";
input double          Lots            = 0.1;
input int             SL              = 70;
input int             TP              = 130;
input int             Magic           = 123;

Input переменные определяют входные параметры программы, они доступны из окна свойств программы.

Параметры советника

 

Если имена глобальных и локальных переменных конфликтуют

Если ваша программа должна использовать глобальную переменную, то может случиться так, что имя глобальной переменной конфликтует с именем локальной переменной. При возникновении такого конфликта язык MQL предоставляет приоритет локальной переменной. Другими словами, программа предполагает, что в случае конфликта каждая ссылка на имя соответствует локальной переменной. При этом в журнале ошибок после компиляции будет выдано предупреждение:

«declaration of ‘my_variable’ hides global declaration at line 6 My_Expert.mq4 28 5».

Итак, что необходимо запомнить

Из этого урока вы узнали, как объявлять локальные переменные внутри функции. Как только ваши функции выполняют более или менее существенную работу, им требуются локальные переменные. Тут также представлены глобальные переменные, чьи имена и значения известны на протяжении всей программы. На следующем уроке вы узнаете, как MQL позволяет объявлять две или несколько функций с одним и тем же именем, но с разными параметрами и типами возвращаемых значений. Перегружая подобным образом имена функций, вы упрощаете использование функций. Итак, резюмируем:

  • Локальные переменные представляют собой переменные, объявленные внутри функции.
  • Локальные переменные известны только той функции, внутри которой они объявлены.
  • Несколько функций могут использовать одно и то же имя для локальной переменной без каких-либо конфликтов.
  • Глобальная переменная представляет собой переменную, чье имя и значение известны на протяжении всей программы.
  • Чтобы объявить глобальную переменную, объявите переменную в начале вашего исходного файла вне какой-либо функции.
  • Поскольку глобальные переменные могут быть легко изменены любой функцией, они привносят возможность появления трудно обнаруживаемых ошибок, поэтому избегайте использования глобальных переменных в своих программах.

 

Written by 

Добавить комментарий