bład wykonania 4007
4007 — ERR_ARRAY_RESIZE_ERROR
Za mało pamięci albo próba zmiany rozmiaru tablicy statycznej. Druga przyczyna jest znacznie częstsza i zaskakuje, bo kompilator jej nie zgłasza.
2 fragmenty kodu z tej strony przeszły przez kompilator MetaEditor build 6090, 2026-08-05.
2026-08-03 09:41:02.118 Ekspert (EURUSD,M5) ArrayResize zwrocilo -1, blad 4007Co ten kod znaczy
Dwie przyczyny o zupełnie różnej wadze: brak pamięci albo próba zmiany rozmiaru tablicy statycznej. Ta druga jest znacznie częstsza.
Tablica statyczna kontra dynamiczna
Rozmiar podany w deklaracji czyni tablicę statyczną raz na zawsze. ArrayResize na takiej tablicy zawsze zawiedzie, a kompilator tego nie zgłosi — bo składniowo wywołanie jest poprawne.
double wartosci[100]; // statyczna: rozmiar ustalony na stałe
ArrayResize(wartosci, 200); // zwroci -1, blad 4007double wartosci[]; // brak rozmiaru w deklaracji
ArrayResize(wartosci, 200); // dzialaTa sama zasada dotyczy tablic przekazywanych do funkcji: parametr zadeklarowany bez rozmiaru i ze znakiem referencji zachowuje charakter tablicy przekazanej, a kopia statycznej pozostaje statyczna.
Kiedy naprawdę chodzi o pamięć
Przy tablicach liczonych w milionach elementów przyczyną bywa brak pamięci. Wtedy warto sprawdzić trzeci argument ArrayResize — rezerwę, która ogranicza liczbę realokacji.
double wyniki[];
//--- rezerwujemy z zapasem: pamiec przydzielana raz, nie tysiac razy
ArrayResize(wyniki, 0, 10000);
for(int i = 0; i < 10000; i++)
{
int rozmiar = ArraySize(wyniki);
if(ArrayResize(wyniki, rozmiar + 1) < 0)
{
PrintFormat("ArrayResize zawiodlo przy %d elementach, blad %d",
rozmiar, GetLastError());
break;
}
wyniki[rozmiar] = i * 1.5;
}