Определение функции

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

тип_результата идентификатор_функции ( тип_параметра идентификатор_параметра
                                        = значение_по_умолчаниюopt ,... )
{
   инструкцияopt
   ...
}

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

void OnStart(void)
{
}

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

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

f[0] = 1
f[1] = 1
f[i] = f[i - 1] + f[i - 2], i > 1

Первые два числа равны 1, а все последующие представляют собой сумму двух предыдущих. Приведем начало ряда: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...

Рассчитать число под заданным номером можно следующей функцией (FuncFibo.mq5).

int Fibo(const int n)
{
   int prev = 0;
   int result = 1;
   for(int i = 0i < n; ++i)
   {
      int temp = result;
      result = result + prev;
      prev = temp;
   }
   return result;
}

Она принимает один параметр n типа int и возвращает результат типа int. Параметр n имеет модификатор const, потому что мы не собираемся менять n внутри функции (такая явная декларация ограничений в "правах" переменных приветствуется — она помогает избежать случайных ошибок).

В локальных переменных prev и result будут храниться текущие значения двух последних чисел ряда. В цикле по i мы вычисляем их сумму, получая очередное число ряда. Предварительно, старое значение result записывается в переменную temp, чтобы после суммирования, переложить его в prev.

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

Входной параметр функции — это тоже локальная переменная, которая будет инициализирована актуальным значением во время вызова функции. Это значение передается "снаружи" из инструкции с вызовом функции.

Имена параметров должны быть уникальными и не совпадать с именами локальных переменных.

Напомним, что тело функции представляет собой блок кода, который определяет видимость и время жизни локальных переменных. Принципы их определения и работы были рассмотрены в разделах Инструкции объявления/определения и Инициализация.