ArrayResize

A função define um tamanho novo para a primeira dimensão

int  ArrayResize(
   void&  array[],              // array passado por referência
   int    new_size,             // novo tamanho de array
   int    reserve_size=0        // valor do tamanho de reserva (excesso)
   );

Parâmetros

array[]

[out] Array para alteração de tamanho.

new_size

[in]  Novo tamanho para a primeira dimensão.

reserve_size=0

[in]  Tamanho alocado para obter reserva.

Valor do Retorno

Se executado com sucesso, a função retorna a quantidade de todos os elementos contidos no array após a alteração do tamanho, caso contrário, retorna -1, e o tamanho do array não é alterado.

Если ArrayResize() применена к статическому массиву, таймсерии или индикаторному буферу, то размер массива остается прежним — такие массивы не могут быть перераспределены. В этом случае если new_size<=ArraySize(array), то функция просто вернет new_size; в противном случае будет возвращено -1.

Observação

A função pode ser aplicada somente para arrays dinâmicos. Deve ser notado que não se pode alterar o tamanho de arrays dinâmicos atribuídos como buffers de indicadores através da função SetIndexBuffer(). Para buffers de indicadores, todas a operações de redimensionamento de tamanho são realizadas pelo subsistema de tempo de execução do terminal.

Total amount of elements in the array cannot exceed 2147483647.

Com uma alocação de memória freqüente, é recomendado usar o terceiro parâmetro que defini um reserva para reduzir o número de alocações físicas de memória. Todas as subseqüentes chamadas de ArrayResize não levam uma realocação física de memória, mas somente alteração do tamanho da primeira dimensão do array dentro da memória reservada. Deve ser lembrado que o terceiro parâmetro será usado somente durante a alocação física de memória. Por exemplo:

ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
   ArrayResize(arr,i,1000);

Neste caso a memória será realocada duas vezes, a primeira vez antes de entrar no loop de elemento 3000 (o tamanho do array será definido para 1000), e a segunda vez com i igual a 2000. Se omitisse o terceiro parâmetro, haveria 2000 realocações físicas de memória, que desaceleraria o programa.

Exemplo:

//+------------------------------------------------------------------+
//| Programa Script da função start (iniciar)                        |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Contadores
   ulong start=GetTickCount();
   ulong now;
   int   count=0;
//--- Um array para demonstração de uma versão rápida
   double arr[];
   ArrayResize(arr,100000,100000);
//--- Verifique quão rápida a variante com a reserva de memória trabalha
   Print("--- Test Fast: ArrayResize(arr,100000,100000)");
   for(int i=1;i<=300000;i++)
     {
      //--- Define um novo tamanho de array especificando a reserva de 100 000 elementos!
      ArrayResize(arr,i,100000);
      //--- Quando alcançar um número redondo, exibe o tamanho do array e tempo gasto
      if(ArraySize(arr)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
         start=now; 
        }
     }
//--- Agora mostra quão lento a versão sem reserva de memória é
   double slow[];
   ArrayResize(slow,100000,100000);
//--- 
   count=0;
   start=GetTickCount();
   Print("---- Teste lenta: ArrayResize(slow,100000)");
//---
   for(int i=1;i<=300000;i++)
     {
      //--- Define um novo tamanho de array, mas sem a reserva adicional
      ArrayResize(slow,i);
      //--- Quando alcançar um número redondo, exibe o tamanho do array e tempo gasto
      if(ArraySize(slow)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
         start=now;
        }
     }
  }
//--- O resultado do script
/*
   Test_ArrayResize (EURUSD,H1)   --- Test Fast: ArrayResize(arr,100000,100000)
   Test_ArrayResize (EURUSD,H1)   1. ArraySize(arr)=100000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   2. ArraySize(arr)=200000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   3. ArraySize(arr)=300000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   ---- Test Slow: ArrayResize(slow,100000)
   Test_ArrayResize (EURUSD,H1)   1. ArraySize(slow)=100000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   2. ArraySize(slow)=200000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   3. ArraySize(slow)=300000 Time=228511 ms
*/

Também Veja

ArrayInitialize