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).
#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).
#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).
#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).
#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.