5. Funkcje własne.

5.12. Funkcja typu void

W poprzednich rozdziałach tej lekcji opisywałem funkcje własne, które zwracały wynik. W MQL4 można przygotować taką funkcję, która wykona swoje zadanie bez zwrócenia wyniku. Dla przykładu weźmy kod 2 z rozdziału 5.2 do obliczenia objętości walca (kod 1).

Kod 1
#property strict

void OnStart()
  {
   double r = 1.0;                  // promień podstawy walca
   double h = 2.5;                  // wysokość walca
   double v = CylinderVolume(r, h); // objętość walca
   Print("Obiętość walca = ", DoubleToString(v));
  }

//--- funkcja własna do obliczenia objętości walca
double CylinderVolume(double radius, double height)
  {
   double volume = M_PI * radius * radius * height;
   return(volume);
  }

Tutaj funkcja CylinderVolume() zwraca wartość typu double, która jest przypisywana zmiennej v, a następnie za pomocą funkcji standardowej DoubleToString() ta wartość liczbowa jest zamieniana na typ string.


Operację zamiany double na string możemy umieścić bezpośrednio w ciele funkcji własnej. Wtedy typ CylinderVolume() ustawimy jako string (zaznaczono na żółto), a cały kod będzie wyglądać w następujący sposób (kod 2).

Kod 2
#property strict

void OnStart()
  {
   double r = 1.0;
   double h = 2.5;
   string v = CylinderVolume(r, h);
   Print("Obiętość walca = ", v);
  }

//--- funkcja własna do obliczenia objętości walca
string CylinderVolume(double radius, double height)
  {
   double volume = M_PI * radius * radius * height;
   string result = DoubleToString(volume);
   return(result);
  }

Ponieważ w tym skrypcie chcemy, aby po obliczeniu objętości walca, wynik został wyświetlony w logach dziennika terminalu, możemy w ogóle wszystkie te operacje przenieść do funkcji własnej. Nie będziemy potrzebowali od niej zwrotu jakiejkolwiek wartości, dlatego typ takiej funkcji powinien być pusty, tj. void (kod 3).

Kod 3
#property strict

void OnStart()
  {
   double r = 1.0;
   double h = 2.5;
   CylinderVolume(r, h);
  }

//--- funkcja własna do obliczenia objętości walca
//--- i wyświetlenia informacji w logach
void CylinderVolume(double radius, double height)
  {
   double volume = M_PI * radius * radius * height;
   string result = DoubleToString(volume);
   Print("Objętość walca = ", result);
  }

Widzisz, w tym przypadku wszystkie operacje obliczenia oraz funkcja Print() znajdują się w ciele CylinderVolume(). Ponieważ żaden wynik nie jest zwracany przez tę funkcję, nie ma w niej operatora return.


Przypiszmy parametrom radius i height wartości domyślne, a zapis DoubleToString(volume) umieścimy od razu w nagłówku Print(), pomijając tworzenie zmiennej result (kod 4).

Kod 4
#property strict

void OnStart()
  {
   CylinderVolume();  // wywołanie funkcji własnej
  }

//--- funkcja własna do obliczenia objętości walca
//--- i wyświetlenia informacji w logach
void CylinderVolume(double radius = 1.0, double height = 2.5)
  {
   double volume = M_PI * radius * radius * height;
   Print("Objętość walca = ", DoubleToString(volume));
  }

Teraz w ciele głównej funkcji skryptu OnStart() możemy wywołać tylko naszą funkcję CylinderVolume(), która użyje domyślne wartości parametrów radius i height, dokona obliczeń i za pomocą funkcji standardowej Print() wyświetli wynik.