Вызов функции
Вызов функции может быть оформлен в виде отдельного оператора, а также содержаться
в любом месте программы, где по смыслу предполагается некоторое значение (за исключением
оговоренных случаев). Формат и правила исполнения вызова функции в равной мере
распространяются на стандартные (встроенные) и пользовательские функции.
Формат вызова функции
Вызов функции состоит из названия функции и списка передаваемых параметров, обрамлённого
круглыми скобками:
Название_функции (Список_параметров ) // Собственно вызов функции
Название, указанное в вызове функции, должно совпадать с названием функции, вызываемой
для исполнения. Список параметров указывается через запятую. Количество параметров,
передаваемых в функцию, ограничено и не может превышать 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).
int start()
{
int n;
int T=15;
for(int i=Func_yes_ret(T);i<=10;i++)
{
n=n+1;
Alert ("Итерация n=",n," i=",i);
}
return;
}
int Func_yes_ret (int Times_in)
{
datetime T_cur=TimeCurrent();
if(TimeHour(T_cur) > Times_in)
return(1);
return(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 имеется техническая возможность вызова специальных функций
из программы, делать это не рекомендуется. Программу, использующую обращение к
специальным функциям, следует считать некорректной.