Przejdź do treści
MQL5 · MetaTrader 5 · po polsku
kod odczarowany

MQL5 / Błędy

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 4007

Co 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.

Tablica, której nie da się powiększyć
double wartosci[100];          // statyczna: rozmiar ustalony na stałe
ArrayResize(wartosci, 200);    // zwroci -1, blad 4007
Tablica dynamiczna
double wartosci[];             // brak rozmiaru w deklaracji
ArrayResize(wartosci, 200);    // dziala

Ta 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.

Rezerwa zamiast realokacji przy każdym dodaniu
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;
  }

Powiązane