Русский

Учебник по MQL4  Операторы  Вызов функции

Вызов функции


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

Формат вызова функции


Вызов функции состоит из названия функции и списка передаваемых параметров, обрамлённого круглыми скобками:

   Название_функции  (Список_параметров )      // Собственно вызов функции

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

My_function (Alf, Bet)                       // Пример вызова функции
// Здесь:
My_function // Название вызываемой функции
Alf // Первый передаваемый параметр
Bet // Второй передаваемый параметр

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

My_function ()                               // Пример вызова функции
// Здесь:
My_function // Название вызываемой функции
// Передаваемые параметры отсутствуют

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

                                             // Для функции с описанием:
int My_function (int a, bool b=true, int c=1, double d=0.5)
{
Операторы
}
// .. допустимы следующие вызовы:
My_function (Alf, Bet, Ham, Del) // Допустимый вызов функции
My_function (Alf ) // Допустимый вызов функции
My_function (3) // Допустимый вызов функции
My_function (Alf, 0) // Допустимый вызов функции
My_function (3, Tet) // Допустимый вызов функции
My_function (17, Bet, 3) // Допустимый вызов функции
My_function (17, Bet, 3, 0.5) // Допустимый вызов функции

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

                                             // Для функции с описанием:
int My_function (int a, bool b=true, int c=1, double d=0.5)
{
Операторы
}
// ..следующие вызовы являются ошибочными:
My_function () // Недопустимый вызов функции: неумолчательные..
// ..параметры опускать нельзя (первый)
My_function (17, Bet, , 0.5) // Недопустимый вызов функции: пропущен..
// ..умолчательный параметр (третий)

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

Формат вызова функции, не возвращающей значение


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

Название_функции  (Список_параметров );       // Оператор вызова функции,не возвращающей знач
Func_no_ret (Alfa, Betta, Gamma);            // Пример оператора вызова функции,..
//.. не возвращающей значение

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

Формат вызова функции, возвращающей значение


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

В случае оформления в виде отдельного оператора вызов функции заканчивается знаком ; (точка с запятой):

Название_функции  (Список_параметров );       // Оператор вызова функции, возвращающей знач
Func_yes_ret (Alfa, Betta, Delta);           // Пример оператора вызова функции,..
//.. возвращающей значение

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

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

Использование вызова функции в составе других операторов определяется форматом этих операторов.

Задача 20. Составить программу, в которой реализуются следующие условия: - если текущее время больше 15:00, то выполнить 10 итераций в цикле for;- в остальных случаях выполнить 6 итераций.

Ниже приведен пример скрипта callfunction.mq4, в котором используются: вызов функции в заголовке оператора for (в составе Выражения_1, согласно формату оператора for, см. Оператор цикла for), вызов стандартной функции в виде отдельного оператора, в правой части оператора присваивания (см. Оператор присваивания) и в заголовке оператора if-else (в Условии, согласно формату оператора if-else, см. Условный оператор if-else).

///--------------------------------------------------------------------
// callfunction.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start() // Описание функции start()
{ // Начало тела ф-ии start()
int n; // Объявление переменной
int T=15; // Заданное время
for(int i=Func_yes_ret(T);i<=10;i++) // Использование функции в..
//.заголовке оператора цикла
{ // Начало тела цикла for
n=n+1; // Счётчик итераций
Alert ("Итерация n=",n," i=",i); // Оператор вызова функции
} // Конец тела цикла for
return; // Выход из функции start()
} // Конец тела ф-ии start()
//--------------------------------------------------------------------
int Func_yes_ret (int Times_in) // Описание пользоват. ф-ии
{ // Начало тела польз. ф-ии
datetime T_cur=TimeCurrent(); // Использование функции в..
// ..операторе присваивания
if(TimeHour(T_cur) > Times_in) // Использование функции в..
//..заголовке операт.if-else
return(1); // Возврат значения 1
return(5); // Возврат значения 5
} // Конец тела пользов. ф-ии
//--------------------------------------------------------------------

В приведенном примере использованы вызовы следующих функций с такими передаваемыми параметрами:

  • в вызове функции Func_yes_ret(T) - переменная T;
  • в вызове функции Alert () - строковые константы "Итерация n=" и " i=", переменные n и i;
  • вызов функции TimeCurrent() не предусматривает передаваемых параметров;
  • в вызове функции TimeHour(T_cur) - переменная T_cur.

В программе реализован очень простой алгоритм. В переменной Т задаётся время в часах, относительно которого производятся вычисления. В заголовке оператора for указан вызов пользовательской функции Func_yes_ret(), которая может возвращать одно из двух значений: 1 или 5. В зависимости от этого значения изменяется количество итераций в цикле: либо их будет 10 (i изменяется от 1 до 10), либо 6 (i изменяется от 5 до 10). Для наглядности в теле цикла используется счётчик итераций, каждое значение которого выводится на экран с помощью функции Alert().

В описании пользовательской функции сначала вычисляется время в секундах, прошедших после 00:00 1 января 1970 года (обращение к функции TimeCurrent()), а затем текущее время в часах (обращение к функции TimeHour()). Разветвление алгоритма осуществляется с помощью оператора if (вызов функции TimeHour() указан в его условии). Если текущее время оказывается больше, чем переданное в пользовательскую функцию (локальная переменная Times_in), то пользовательская функция возвращает 1, иначе - возвращает 5.

Обратите внимание:

В программе нет описаний стандартных функций и вызова специальной функции start().

Ниже показана функциональная схема скрипта callfunction.mq4:



Рис. 51. Функциональная схема программы, использующей обращение к функциям.

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

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