Русский

Учебник по MQL4  Операторы  Описание функции и оператор return

Описание функции и оператор return


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

Формат описания функции


Описание функции состоит из двух основных частей - заголовка функции и тела функции.

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

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

Тип_возвращаемого_значения Название_функции (Список формальных параметров)//Заголовок
{ // Открывающая фигурная скобка
Программный код, // Тело функции может состоять ..
составляющий тело //.. из операторов и ..
функции //.. обращений к другим функциям
} // Закрывающая фигурная скобка

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

int My_function (int a, double b)      // Пример описания функции
{
int c = a * b + 3; // Оператор тела функции
return (c); // Оператор выхода из функции
}
// Здесь (слева направо в заголовке):
int // Тип возвращаемого значения
My_function // Название функции
int a // Первый формальный параметр а целого типа
double b // Второй формальный параметр b дествит. типа

Параметры, передаваемые в функцию, могут иметь значения по умолчанию, которые задаются константами соответствующего типа:

int My_function (int a, bool b=true, int c=1, double d=0.5)//Пример описания функции
{
a = a + b*c + d2; // Оператор тела функции
int k = a * 3; // Оператор тела функции
return (k); // Оператор выхода из функции
}
// Здесь (слева направо в заголовке):
int // Тип возвращаемого значения
My_function // Название функции
int a // Первый формальный параметр а целого типа
bool b // Второй формальный параметр b логическ.типа
true // Константа - умолчательное значение для b
int c // Третий формальный параметр c целого типа
1 // Константа - умолчательное значение для c
double d // Четвёрт. формальный параметр d действ.типа
0.5 // Константа - умолчательное значение для d

a,b,c,d,k // Локальные переменные

Если в вызове функции, имеющей умолчательные значения, указаны фактические параметры, то к расчёту в функции будут приняты значения фактических параметров. Если в вызове функции, имеющей умолчательные значения, не указаны какие-то фактические параметры, то к расчёту в функции принимаются соответствующие значения по умолчанию.

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

Правила исполнения функции


Место в программе для описания функции:

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

Исполнение функции:

Вызванная для исполнения функция исполняется в соответствии с кодом, составляющим тело функции.

Формат оператора return


Возвращаемое функцией значение - это значение параметра, указанного в скобках оператора return. Оператор return состоит из ключевого слова return, Выражения, обрамлённого круглыми скобками, и заканчивается знаком ; (точка с запятой). Полноформатный оператор return:

   return (Выражение );                        // Оператор return

В качестве выражения в круглых скобках может быть указана константа, переменная или вызов функции. Тип значения, возвращаемого с помощью оператора return, должен совпадать с типом возвращаемого значения функции, указанным в заголовке. В случае если этого совпадения нет, значение выражения, указанного в операторе return, приводится к типу возвращаемого значения, указанному в заголовке описания функции. В случае если такое преобразование невозможно, на этапе компиляции программы редактор MetaEditor выдаст сообщение об ошибке.

Правило исполнения оператора return


Оператор return прекращает исполнение ближайшей внешней функции и передаёт управление в вызывающую программу в соответствии с правилами, определёнными для вызова функции. Значением, возвращаемым функцией, является значение выражения, указанного в операторе return. Если тип значения параметра, указанного в операторе return, не совпадает с типом возвращаемого значения, указанным в заголовке функции, то значение приводится к типу возвращаемого значения, указанному в заголовке.

Пример использования оператора return, возвращающего значение:

bool My_function (int Alpha)                 // Описание пользовательской функции
{ // Начало тела функции
if(Alpha>0) // Оператор if
{ // Начало тела оператора if
Alert("Значение положительно"); // Вызов стандартной функции
return (true); // Первый выход из функции
} // Конец тела оператора if
return (false); // Второй выход из функции
} // Конец тела функции

В функциях с типом возвращаемого значения void необходимо использовать оператор return без выражения:

   return;                                   // Оператор return без выражения в круглых скобках

Пример использования оператора return без возврата значения:

void My_function (double Price_Sell)         // Описание пользовательской функции
  {                                          // Начало тела функции
   if(Price_Sell-Ask >100 * Point)           // Оператор if
      Alert("Прибыль по ордеру более 100 п");// Вызов стандартной функции
   return;                                   // Выход из функции
  }                                          // Конец тела функции

В описании функции допускается отсутствие оператора return. В этом случае функция автоматически завершает работу, если (в соответствии с исполняемым алгоритмом) в теле функции исполнился последний оператор. Пример описания функции, в которой не указан оператор return:

void My_function (int Alpha)                 // Описание пользовательской функции
{ // Начало тела функции
for (int i=1; i<=Alpha; i++) // Оператор цикла
{ // Начало тела цикла
int a = 2*i + 3; // Оператор присваивания
Alert ("a=", a); // Оператор вызова станд. функции
} // Конец тела цикла
} // Конец тела функции

В данном случае функция завершит работу в момент окончания исполнения оператора цикла for. Последним движением при исполнении функции будет проверка условия в операторе цикла. Как только Условие в заголовке оператора цикла for станет ложным, управление будет передано за пределы оператора цикла. Но в связи с тем, что оператор цикла является последним исполняемым оператором в теле функции My_function (), пользовательская функция завершит работу, а управление будет передано за пределы функции, именно в то место, откуда функция была вызвана на исполнение.