1. MQL4 dla początkujących. Część I.

1.7. Tablice

Wraz ze zmiennymi i funkcjami, tablice (ang. arrays) stanowią bardzo ważną część każdego języka programowania. Przyznam się, że na początku mojej nauki MQL4 był to dla mnie trudny temat między innymi dlatego, że nie miałem przed tym doświadczenia w programowaniu. Jednak po jakimś czasie zrozumiałem, że tablice nie są tak skomplikowane jak to sobie wyobrażałem.

Przeanalizujmy razem następujący przykład. W pamięci komputera trzeba umieścić 5 liczb, które później wykorzystamy do obliczeń. Jak to zrobić? Można utworzyć osobno 5 zmiennych i przypisać im wartości.

Kod 1
#property strict

double price_Bartek = 1.2341,
       price_Kasia  = 1.2321,
       price_Michal = 1.2361,
       price_Magda  = 1.2411,
       price_Benek  = 1.2301;

void OnStart()
  {
//---
  
  }

Tutaj w granicach jednej instrukcji utworzono 5 zmiennych typu double i przypisano im wartości liczbowe. Można postąpić inaczej, używając jedną tablicę (kod 2).

Kod 2
#property strict

double price_Friend[5];      // deklaracja tablicy składającej się z 5 elementów

void OnStart()
  {
//---
   price_Friend[0] = 1.2341; // przypisujemy wartość pierwszemu elementowi tablicy,
                             // który ma indeks zero [0].
   price_Friend[1] = 1.2321;
   price_Friend[2] = 1.2361;
   price_Friend[3] = 1.2411;
   price_Friend[4] = 1.2301;
  }

Tutaj przed funkcją główną OnStart() zadeklarowano tablicę, a następnie w ciele funkcji każdemu elementowi tablicy przypisano odpowiednią wartość liczbową. Deklaracja tablicy w tym przykładzie wygląda w następujący sposób:

Kod 3
double price_Friend[5];

Aby utworzyć tablicę najpierw należy określić jej typ (double), następnie jej nazwę (price_Friend), potem w kwadratowych nawiasach należy określić ilość elementów tej tablicy [5], a na samym końcu wstawić średnik. W MQL4 schemat tworzenia tablicy wygląda w następujący sposób:

  • typ tablicy nazwa tablicy [ ilość elementów tablicy ] ;

Widzisz, deklaracja tablicy rożni się od deklaracji zmiennej tylko tym, że po nazwie w kwadratowych nawiasach [ ] należy zapisać ilość elementów. W naszym przykładzie tablica będzie zawierać 5 elementów.

Ponieważ przed OnStart() (kod 2) określiliśmy typ tablicy jako double to i każdy jej element też będzie miał taki typ. Przypisanie wartości elementowi tablicy różni się od przypisania wartości zmiennej tylko tym, że w[ ] należy zapisać indeks odpowiedniego elementu tablicy.

Kod 4
price_Friend[0] = 1.2341;

Teraz dochodzimy do bardzo ważnej rzeczy, którą trzeba zapamiętać.


W tablicach indeksacja elementów zaczyna się od zera [0], a nie od jeden [1] !

W naszym przykładzie (kod 2) tablica o nazwie price_Friend składa się z 5 elementów: pierwszy ma indeks 0, drugi ma indeks 1, a ostatni piąty element ma w tablice indeks 4.

Z elementami tablicy można postępować tak samo jak i ze zmiennymi. Właściwie to są takie same zmienne tylko, że są one jak by członkami rodziny (tablica), jej wszyscy członkowie mają takie same nazwisko (nazwa tablicy), ale każdy z nich ma swoje unikalne imię (indeks). Używając tę tablicę i funkcję Alert() spróbuj wyświetlić swój wiek na monitorze.

Kod 5
#property strict

void OnStart()
  {
//---
   string word[2]; // deklaracja tablicy typu tekstowego 'string', 2 elementy
   int    year[2]; // deklaracja tablicy typu liczb całkowitych 'int', 2 elementy

//--- przypisanie poszczególnym elementom tablic wartości
   word[0] = "Mam "; word[1] = " lat";
   year[0] = 1990;   year[1] = 2015;

//--- wyświetlić wynik
   Alert( word[0] , year[1] - year[0] , word[1] );
  }

Powyższy kod to po prostu kolejny wariant realizacji zadania, które zostało omówione w poprzednim rozdziale, tylko że tu zrealizowano go używając tablice. W tym kodzie 2 tablice (kod 6) zadeklarowano nie przed OnStart(), a w ciele tej funkcji głównej.

Kod 6
string word[2];
int    year[2];

Następnie poszczególnym elementom tablic przypisujemy wartości (kod 7). Pierwszy element tablicy word z indeksem [0] będzie miał wartość "Mam ", a z indeksem [1] wartość " lat". Pierwszy element tablicy year z indeksem [0] bedzie miał wartość 1990, a z indeksem [1] wartość 2015.

Kod 7
word[0] = "Mam "; word[1] = " lat";
year[0] = 1990;   year[1] = 2015;

Ostatni krok to podstawienie elementów tablic w nagłówek funkcji Alert() (kod 8).

Kod 8
Alert( word[0] , year[1] - year[0] , word[1] );

Na miejscu pierwszego argumentu stoi tu word[0]. Po przecinku znajduje się drugi argument, którym jest działanie matematyczne year[1] - year[0]. Dalej po przecinku został zapisany trzeci argument word[1].

W kodzie 5 najpierw zadeklarowaliśmy 2 tablice, a potem w osobnych instrukcjach przypisaliśmy elementom tych tablic wartości. W MQL4 w jednej instrukcji można zadeklarować tablicę i od razu przypisać wartości jej elementom. Wtedy w kwadratowych nawiasach można nie podawać ilość elementów, a po znaku równania między klamrami { } zapisać wartości rozdzielone przecinkami. W oparciu o ilość wartości kompilator sam ustali ilość elementów tablicy i zarezerwuje dla nich miejsce w pamięci RAM.

Kod 9
#property strict

void OnStart()
  {
//---
   string word[] = { "Mam ", " lat" }; // deklaracja i inicjalizacja tablicy word
   int    year[] = { 1990, 2015 };     // deklaracja i inicjalizacja tablicy year

//--- wyświetlić wynik
   Alert( word[0] , year[1] - year[0] , word[1] );
  }

W tym kodzie dla tablicy word kompilator utworzy 2 elementy, ponieważ w klamrach zapisaliśmy 2 wartości: "Mam " i " lat". Pierwszemu elementowi, tj. word[0], kompilator przypisze wartość "Mam ", a word[1] będzie miał " lat". W taki sam sposób kompilator obrobi tablicę year.

Wybiegając trochę do przodu powiem, że tablice mogą mieć takie same typy co i zmienne. Mogą one być nie tylko jednowymiarowe jak w naszym przykładzie, ale i wielowymiarowe (maksymalnie 4 wymiary). Są tablice statyczne i dynamiczne oraz istnieje kilka sposobów ich inicjalizacji.