MetaQuotesLanguage i referencje

Często (głównie w celach optymalizacyjnych) byłoby dobrze, gdyby funkcja MQL potrafiła zwrócić kilka wartości.

Niestety MQL nie obsługuje programowania obiektowego, nie ma też struktur. Sytuacja jednak nie jest do końca beznadziejna, bowiem do uzyskania podobnego efektu można użyć mechanizmu przekazywania parametrów przez referencję. Najpierw jednak omówię jak działa domyślne przekazywanie przez wartość. Zakładamy, że mamy dwie zmienne oraz przykładową funkcję:

int x=1;
int y=2;

void f(int a, int b) {
 a+=5;
 b-=5;
}

void start() {
 f(x,y);
 Print(x+" "+);
}

I teraz jeśli w kodzie funkcji start() wywołamy tę funkcję f(x,y) to z x, y… nie stanie się zupełnie nic – tzn. w dzienniku zostaną wydrukowane liczby 1 i 2, czyli ich wartości początkowe.

Liczby nie zostaną zmienione dlatego, że domyślnie wartość x i y będących parametrami jest kopiowana, czyli wygląda to tak, jakby platforma dokonała przypisania a=x i b=y zanim jeszcze wywoła funkcję. A z racji, że a i b mają zasięg lokalny ograniczony ciałem funkcji wszelkie zmiany na nich dokonane mają skutek jedynie w tej funkcji.

W przypadku referencji sprawa wygląda tak:

int x=1;
int y=2;

void g(int& a, int& b) {
 a+=5;
 b-=5;
}

void start() {
 g(x,y);
 Print(x+" "+y);
}

Tutaj kluczowy jest operator „&” wskazujący, że parametr ma być przekazywany przez referencję. Oznacza to, że przy wywołaniu g(x,y) w następuje „przypisanie” a=x oraz b=y, wykonanie funkcji, a po zakończeniu funkcji g nastąpi odwrotne „przypisanie”, czyli x=a i y=b. Końcowy efekt jest taki, że w dzienniku zostaną wydrukowane liczby 6 i -3.

Oczywiście referencje nie mają żadnego wpływu na wartości zwracane bezpośrednio przez funkcje (czyli przez return), więc można oba mechanizmy stosować jednocześnie.

Mam nadzieję, że w miarę obrazowo udało mi się wyjaśnić działanie referencji, nie mniej jednak zalecam pobawienie się przez chwilę i potestowanie samemu jak to działa i jak tego używać.

W najbliższych dniach opublikuję funkcję, na której zaprezentuję jak referencje sprawdzają się w „warunkach bojowych” oraz jak dzięki nimi uzyskać wzrosty wydajności działania kodu.

Autor: Łukasz Tomaszkiewicz

Podziel się ze znajomymi:

Prześlij nam swoje uwagi

[contact-form-7 404 "Not Found"]
  • Facebook