5. Funkcje własne.

5.8. Przekazywanie tablic do funkcji

Jak już napisałem w rozdziale 5.5. Przekazywanie danych do funkcji własnej, tablicę do funkcji można przekazać wyłącznie za pomocą wskaźnika. Wiemy już, że w takim przypadku funkcja będzie pracować z oryginalnymi wartościami. Istnieje możliwość ich zmiany co może być szalenie niebezpieczne. Aby tego uniknąć należy używać specyfikatora const. Na przykładzie poniższego kodu 1, pokaże jak należy prawidłowo przekazywać tablicę do funkcji i jak wewnątrz funkcji korzystać z elementów tablicy.

Kod 1
#property strict

void OnStart()
  {
   double array[2];  // deklaracja tablicy składającej się z 2 elementów
   array[0] = 1.0;   // przypisujemy 1.0 elementowi tablicy z indeksem [0]
   array[1] = 2.5;   // przypisujemy 2.5 elementowi tablicy z indeksem [1]

   double v = CylinderVolume(array);  // wywołanie funkcji

   Print("Obiętość walca = ", DoubleToString(v));
  }

//--- funkcja własna do obliczenia objętości walca
double CylinderVolume(const double & f_arr[])
  {
   double volume = M_PI * f_arr[0] * f_arr[0] * f_arr[1];
   return(volume);
  }

Aby do funkcji przekazać tablicę, podczas jej wywołania w nagłówku należy zapisać tylko nazwę tablicy. W opisie funkcji piszemy: const, typ przekazywanej tablicy, potem &, nazwę pod jaką tablica będzie występować w funkcji, a na końcu [].

Aby funkcja mogła skorzystać z wartości, przypisanych poszczególnym elementom tablicy, w [] należy zapisac odpowiedni numer indeksu. W powyższym przykładzie w formule obliczenia objętości walca zapisano f_arr[0] oraz f_arr[1]. Łatwo się domyśleć, że f_arr[0] weźmie 1.0 od array[0], a f_arr[1] weźmie 2.5 od array[1].

Po uruchomieniu tego skryptu w MetaTrader 4 w logach terminala zobaczymy następujące wpisy (rys. 1).

Rys. 1. Wynik działania skryptu.


Przekazując tablicę, należy uważać aby w funkcji nie powołać się na nieistniejący element tablicy. Jeśli w powyższym przykładzie w formule zapiszemy np. f_arr[2] (kod 2), tj. będziemy kazać funkcji wziąć wartość z nieistniejącego elementu o indeksie 2, to skrypt skompiluje się bez błędu, ale już po jego uruchomieniu w MT4 w logach terminala wyskoczy błąd ”Test EURUSD,H4: array out of range in 'Test.mq4' (17,54)”, tj. w programie 'Test.mq4' tablica wyszła poza granice (rys. 2). Cyfry 17,54 oznaczają problemowe miejsce w kodzie źródłowym: 17 linijka, 54 znak od lewej strony. W ten sposób można łatwo dojść do tego krytycznego miejsca i poprawić błąd.

Kod 2
#property strict

void OnStart()
  {
   //...
  }

//--- funkcja własna do obliczenia objętości walca
double CylinderVolume(const double & f_arr[])
  {
   double volume = M_PI * f_arr[0] * f_arr[0] * f_arr[2];
   return(volume);
  }

Rys. 2. Wynik działania skryptu.