Урок №7 Функции

Уроки

         Добро пожаловать в мир функций языка MQL4. Работа с функциями в любом языке состоит из двух этапов: изучение функций, что, порой, очень скучное занятие и использование функций, что всегда является «спасательной шлюпкой». Итак, начнём седьмой урок.

В чём смысл функций ?

        Функция очень похожа на мясорубку — вы кладёте в неё мясо, лук, специи и получаете фарш. Мясо, лук и специи называются параметрами функции (входными параметрами функции), фарш — возвращаемое значение. А механизм мясорубки — тело функции.

           Есть только одно различие между функциями и Вашей мясорубкой: некоторые функции возвращают НИЧЕГО (в MQL4 ничего называется словом void).

Например:

double										// тип фарша - возвращаемое значение
my_func (double a, double b, double c)  // название функции и список параметров (мясо, лук и специи)

  {								 

   return (a*b + c);							   // фарш на выход - функция возвращает некоторое значение

  }

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

           В данном случае – три параметра: double a, double b, double c. Затем идёт тело функции, которое заключено в фигурные скобки. В данном примере, тело функции выполнит операцию (a*b + c). Ключевое слово return ответственно за возвращение итого результата.

Ключевое слово return

            Оператор return (); завершает работу функции (как break; завершает работу цикла), и передаёт контоль в точку вызова функции (об этом поговорим позже).

          Оператор return (); может содержать выражение в своих скобках, как в нашем примере. Это означает, что надо завершить работу функции и вернуть результат вычисление этого выражения.

             Или оператор return (); может не содержать выражения в своих скобках. Тогда его единственная задача – завершить работу функции.

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

void								 // void означает, что фарша не будет – возвращаемое значение
my_func (string s) // function name and parameters list (meat & spices)

  {								 

	   Print(s);

  }

           Эта функция не вернёт никакого значения, но она напечатает параметр s, который Вы ей предоставите. Чтобы показать, что функция ничего не возвращает, используется void в качестве её возвращаемого значения.

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

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

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

            Допустим, у Вас есть функция, котороая возвращает сумму двух integer. Вот она:

int collect (int first_number, int second_number) 

  {								 

	   return(first_number+ second_number);

  }

               Вы хотите ей воспользоваться в своей программе. Делается это так:

int a = 10;

int b = 15;

int sum = [b]collect[/b](a,b);

Print (sum);

              В этом примере на экран распечатается 25. Удивительно! Но как компьютер узнал, что печатать?

      Удивительной является строчка int sum = collect(a,b); Здесь Вы объявили переменную sum, чтобы в неё положить возвращаемое значение, а затем дали функции на вход два параметра (a,b). Вы просто-напросто вызвали функцию.

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

          На самом деле, происходит следующее: в процессе компиляции MQL4 заменяет строчку с вызовом функции в вашей программе целиком телом самой функции (с учётом Ваших параметров). Причём вместо оператора return(); MQL4 производит присваивание возвращаемого им значения в подготовленную Вами переменную.

Вложение функций друг в друга

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

Например:

void print_collection (int first_number, int second_number) 

  {								 

	   int sum = collect(first_number, second_number);

	   Print(sum);

  }

            В этом примере мы вызвали функцию collect внутри функции print_collection и распечатали результат. void означает, что возвращаемого значения нет (ещё помните?).

               Спец. функции MQL4: init(), deinit(), start().

             В MQL4 любая программа начинает своё выполнение с функции “init()” (initialize) и она срабатывает, когда Вы перетаскиваете программу (советника или индикатор) на график MetaTrader или если Вы поменяете валюту или период графика.

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

               Когда Ваша программа заканчивает свою работу, или Вы закрываете окно графика, или меняете валюту или период графика, или закрываете терминал, срабатывает функция “deinit()” (de-initialize).

          Третья функция (самая важная) “start()” срабатывает каждый раз, когда приходят новые котировки. Ведь 90% своей программистской жизни Вы проводите внутри этой функции.

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

Урок №7 Функции: Один комментарий

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