ArrayResize

La funzione imposta una nuova grandezza per la prima dimensione

int  ArrayResize(
   void&  array[],              // array passato per riferimento 
   int    new_size,             // nuova grandezza array
   int    reserve_size=0        // riserva valore grandezza (eccesso)
   );

Parametri

array[]

[out] Array per cui cambiare la grandezza.

new_size

[in]  Nuova grandezza per la prima dimensione.

reserve_size=0

[in]  Grandezza distribuita per avere la riserva.

Valore restituito

Se eseguita correttamente, restituisce il conteggio di tutti gli elementi contenuti nell' array dopo il ridimensionamento, in caso contrario, restituisce -1, e l'array non viene ridimensionato.

se ArrayResize() viene applicato ad un array, ad una timeseries o ad un buffer di indicatore , la dimensione dell'array rimane la stessa – questi array non verranno riallocati. In questo caso se new_size <=ArraySize (array ) , la funzione restituirà solo new_size ; altrimenti verrà restituito il valore di -1.

Nota

La funzione può essere applicata solo agli array dinamici. Va notato che non è possibile modificare la grandezza degli array dinamici assegnati come buffers di indicatore dalla funzione SetIndexBuffer(). Per i buffers indicatore, tutte le operazioni di ridimensionamento vengono eseguite dal sottosistema runtime del terminale.

Total amount of elements in the array cannot exceed 2147483647.

Con una frequente allocazione di memoria, si raccomanda di utilizzare un terzo parametro che imposta una riserva per ridurre il numero di allocazioni di memoria fisica. Tutte le chiamate successive di ArrayResize non portano ad una riallocazione della memoria fisica, ma solo modificano la grandezza della prima dimensione dell' array all'interno della memoria riservata. Va ricordato che il terzo parametro verrà utilizzato solo durante l'allocazione di memoria fisica. Ad esempio:

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

In questo caso, la memoria viene riallocata due volte, inizialmente, prima di inserire il ciclo di 3000-elementi (la grandezza dell'array sarà impostata a 1000), e la seconda volta poi con i pari a 2000. Se saltiamo il terzo parametro, ci saranno 2000 riallocazioni fisiche della memoria, che rallenteranno il programma.

Esempio:

//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script                                         |
//+--------------------------------------------------------------------------------+
voidOnStart()
  {
//--- Contatori
   ulong start=GetTickCount();
   ulong now;
   int   count=0;
//--- Un array per la dimostrazione di una versione rapida
   double arr[];
   ArrayResize(arr,100000,100000);
//--- Controllare quanto velocemente funziona con la variante di riserva di memoria
   Print("--- Test Fast: ArrayResize(arr,100000,100000)");
   for(int i=1;i<=300000;i++)
     {
//--- Impostare una nuova dimensione array che specifica la riserva di 100.000 elementi!
      ArrayResize(arr,i,100000);
//--- Quando si raggiunge un numero tondo, mostrare la dimensione dell'array ed il tempo trascorso
      if(ArraySize(arr)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
         start=now; 
        }
     }
//--- Ora mostra, quanto è lenta la versione senza riserve di memoria
   double slow[];
   ArrayResize(slow,100000,100000);
//--- 
   count=0;
   start=GetTickCount();
   Print("---- Test Slow: ArrayResize(slow,100000)");
//---
   for(int i=1;i<=300000;i++)
     {
      //--- Impostare una nuova dimensione array, ma senza la riserva aggiuntiva
      ArrayResize(slow,i);
//--- Quando si raggiunge un numero tondo, mostrare la dimensione dell'array ed il tempo trascorso
      if(ArraySize(slow)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
         start=now;
        }
     }
  }
//--- Un semplice risultato dello 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
*/

Vedi anche

ArrayInitialize