Funkcje tablicowe:   ArrayResize()

Funkcja int ArrayResize() ustawia nowy rozmiar pierwszego wymiaru tablicy. Jeśli zmiana się powiedzie, funkcja zwróci ilość elementów po zmianie. Jeśli nie, funkcja zwróci -1 i rozmiar tablicy nie zostanie zmieniony. Funkcję można stosować tylko do tablic dynamicznych. Ilość elementów tablicy nie może być większa niż 2147483647, tj. maksymalna wartość typu int . Więcej informacji można znaleźć w specyfikacji MQL4.


Przykład 1

Skrypt do ustawienia rozmiaru dynamicznej tablicy array[] na 1000 elementów.

#property strict
void OnStart()
  {
//---
   double array[];        // tablica dynamiczna
   int    newSize = 1000; // nowy rozmiar tablicy

//--- zmienić rozmiar tablicy
   int arraySize = ArrayResize(array, newSize);

//--- wyświetlić wynik
   Print("Nowy rozmiar tablicy = ",arraySize);
  }

Rys. 1. Przykład stosowania funkcji ArrayResize().


W przypadku jeśli przewiduje się wielokrotna zmiana rozmiaru tablicy zalecane jest stosowanie trzeciego parametru, który tworzy rezerwę w celu uniknięcia fizycznej relokacji pamięci.


Przykład 2

Przykład skryptu, gdzie rozmiar dynamicznej tablicy arraySlow[] ustawiono na 1 bez rezerwacji (brak 3-go parametru), a rozmiar dynamicznej tablicy arrayFast[] ustawiono na 1 z dodatkową rezerwacją 500000 elementów. Każda z nich następnie została poddana 500000-krotnej zmianie rozmiaru i jak widać w przypadku arrayFast[] wcześniejsza rezerwacja dodatkowych elementów pozwoliła znacząco przyspieszyć ten proces (rys. 2).

#property strict
void OnStart()
  {
//=== pokazać wolny sposób wielokrotnej =====
//    zmiany rozmiaru tablicy bez rezerwy
   double arraySlow[];  // tablica

//--- zmiana rozmiaru tablicy bez rezerwy
   ArrayResize(arraySlow, 1);

//--- liczniki
   ulong startCount = GetTickCount();
   ulong differ;

//--- 500000-krotna zmiana rozmiaru tablicy
   for(int i = 0; i < 500000; i++)
      ArrayResize(arraySlow, i);

//--- policzyć ile to zajęło czasu, ms
   differ = GetTickCount() - startCount;
//--- wyświetlić wynik
   Print("500000-krotna zmiana rozmiaru tablicy ",
         "bez rezerwacji zajęła = ",differ," ms.");

//=== pokazać szybki sposób wielokrotnej =====
//    zmiany rozmiaru tablicy z rezerwą
   double arrayFast[];  // tablica

//--- zmiana rozmiaru tablicy z rezerwą 500000
   ArrayResize(arrayFast, 1, 500000);

//---
   startCount = GetTickCount();

//--- 500000-krotna zmiana rozmiaru tablicy
   for(int i = 0; i < 500000; i++)
      ArrayResize(arrayFast, i);

//--- policzyć ile to zajęło czasu, ms
   differ = GetTickCount() - startCount;
//--- wyświetlić wynik
   Print("500000-krotna zmiana rozmiaru tablicy ",
         "z rezerwacją zajęła = ",differ," ms.");
  }

Rys. 2. Przykład stosowania funkcji ArrayResize().