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