5. Funkcje własne.

5.3. Opis funkcji własnej

Każda funkcja składa się z dwóch części - głowy i ciała.

Rys. 1. Opis funkcji własnej.


Na etapie projektowania funkcji powinniśmy już wiedzieć nie tylko to co ma ona obliczyć, ale także i to jakiego typu wynik powinna ona zwrócić. W naszym przykładzie (rys. 1) wiemy, że funkcja CylinderVolume() obliczy objętość walca, a potem zwróci liczbę typu double. Dlatego głowa funkcji zaczyna się od zapisu jej typu, który jest identyczny do typu zwracanego wyniku (1) (rys. 2). Dalej idzie nazwa funkcji (2), a w okrągłych nawiasach zapisywane są formalne parametry, z którymi ta funkcja ma pracować. Najpierw należy podać typ formalnego parametru (3), a potem jego nazwę (4). Parametry oddziela się od siebie przycinkiem (5).

W ciele funkcji, tj. między klamrami {}, zapisuje się wszelkie działania (instrukcje, operatory, odwołania do innych funkcji itd.) jakie ta funkcja ma wykonać. Finalny wynik od funkcji do miejsca w programie, skąd została ona wywołana, przekazywany jest za pomocą return. Zwracany wynik należy zapisać po tym operatorze. Można w nawiasach jak na poniższym rysunku, a można i bez nich, np. jako return volume.

Rys. 2. Skład funkcji.


Należy pamiętać, że opis funkcji własnej nie może znajdować się w ciele innej funkcji - głównej, standardowej lub innej funkcji własnej. Wracając do kodu 2 z poprzedniego rozdziału, widzimy że opis CylinderVolume() znajduje się poza granicami ciała głównej funkcji skryptu OnStart(). Niżej (kod 1) zapisałem skróconą wersję tego kodu, gdzie na żółto zaznaczyłem granice OnStart().

Kod 1
#property strict

void OnStart()
  {
   // ...
   double v = CylinderVolume(r,h);  // wywołanie funkcji własnej
   // ...
  }

// opis funkcji własnej
double CylinderVolume(...)
  {
   // ...
  }

W poniższym kodzie 2 podałem przykład błędnego opisu funkcji własnej wewnątrz OnStart().

Kod 2
#property strict

void OnStart()
  {
   // ...
   double v = CylinderVolume(r,h);  // wywołanie funkcji własnej
   // ...

   // opis funkcji własnej
   double CylinderVolume(...) // Błąd! Nie można opis funkcji własnej
     {                        // umieszczać wewnątrz innej funkcji,
      // ...                  // np. w OnStart()
     }
  }


Opis funkcji powinien znajdować się osobno, poza granicami jakichkolwiek innych funkcji.

Funkcje można opisywać zarówno przed jak i po OnStart() lub innej funkcji głównej programu MQL4. Pamiętamy, że funkcje własne stosuje się m.in. do poprawienia czytelności kodu, dlatego najlepiej jednak umieszczać je na samym końcu, aby nie plątały się przed oczami.