ArrayResize

La fonction définit une nouvelle taille pour la première dimension

int  ArrayResize(
   void&  array[],              // tableau passé par référence
   int    new_size,             // nouvelle taille du tableau
   int    reserve_size=0        // valeur de la taille de réserve (excès)
   );

Paramètres

array[]

[out] Tableau à redimmensionner.

new_size

[in]  Nouvelle taille pour la première dimension.

reserve_size=0

[in]  Taille distribuée à réserver.

Valeur de Retour

En cas d'exécution réussie, retourne le nombre d'éléments contenus dans le tableau après la redimmensionnement, sinon retourne -1 et le tableau n'est pas redimensionné.

Si ArrayResize() est appliqué à un tableau statique, une timeseries ou le buffer d'un indicateur, la taille du tableau reste la même — ce tableaux ne peuvent pas être réalloués. Dans ce cas, si new_size<=ArraySize(array), la fonction ne retourne que new_size ; sinon elle retourne -1.

Note

La fonction ne peut être appliquée qu'à des tableaux dynamiques. Il est à noter que vous ne pouvez pas changer la taille des tableaux dynamiques assignés aux buffers d'un indicateur par la fonction SetIndexBuffer(). Pour les buffers d'indicateur, toutes les opérations de redimmensionnement sont effectuées par le système d'exécution du terminal.

Le nombre total d'éléments du tableau ne peut pas excéder 2 147 483 647.

En cas d'allocation mémoire fréquente, il est recommandé d'utiliser un troisième paramètre pour définir une réserve afin de réduire le nombre d'allocations mémoire physiques. Tous les appels ultérieurs à ArrayResize ne mènent pas à une réallocation physique de la mémoire, mais change uniquement la taille de la première dimension du tableau dans la mémoire réservée. Le troisième paramètre ne sera utilisé qu'en cas d'allocation physique de la mémoire. Par exemple :

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

Dans ce cas, la mémoire sera réallouée deux foix, d'abord avant d'entrer dans la boucle de 3000 éléments (la taille du tableau sera définie à 1000), et la seconde fois lorsque i sera égal à 2000. Si nous oublions le troisième paramètre, il y a aura 2000 réallocations physiques de la mémoire, ce qui ralentira le programme.

Exemple :

//+------------------------------------------------------------------+
//| Fonction de démarrage du script                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Compteurs
   ulong start=GetTickCount();
   ulong now;
   int   count=0;
//--- Tableau pour la démonstration de la version rapide
   double arr[];
   ArrayResize(arr,100000,100000);
//--- Vérifie la vitesse de la version avec réservation de la mémoire
   Print("--- Test Rapide: ArrayResize(arr,100000,100000)");
   for(int i=1;i<=300000;i++)
     {
      //--- Définit une nouvelle taille de tableau en spécifiant une réserve de 100 000 éléments !
      ArrayResize(arr,i,100000);
      //--- Lorsqu'un chiffre rond est atteint, affiche la taille du tableau et le temps passé
      if(ArraySize(arr)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
         start=now; 
        }
     }
//--- Affiche maintenant la vitesse de la version lente sans réservation de la mémoire
   double slow[];
   ArrayResize(slow,100000,100000);
//--- 
   count=0;
   start=GetTickCount();
   Print("---- Test Lent: ArrayResize(slow,100000)");
//---
   for(int i=1;i<=300000;i++)
     {
      //--- Définit une nouvelle taille de tableau mais sans spécifier une réserve supplémentaire
      ArrayResize(slow,i);
      //--- Lorsqu'un chiffre rond est atteint, affiche la taille du tableau et le temps passé
      if(ArraySize(slow)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(slow)=%d Temps passé=%d ms",count,ArraySize(slow),(now-start));
         start=now;
        }
     }
  }
//--- Un exemple de résultat du script
/*
   Test_ArrayResize (EURUSD,H1)   --- Test Rapide : ArrayResize(arr,100000,100000)
   Test_ArrayResize (EURUSD,H1)   1. ArraySize(arr)=100000 Temps passé=0 ms
   Test_ArrayResize (EURUSD,H1)   2. ArraySize(arr)=200000 Temps passé=0 ms
   Test_ArrayResize (EURUSD,H1)   3. ArraySize(arr)=300000 Temps passé=0 ms
   Test_ArrayResize (EURUSD,H1)   ---- Test Lent : ArrayResize(slow,100000)
   Test_ArrayResize (EURUSD,H1)   1. ArraySize(slow)=100000 Temps passé=0 ms
   Test_ArrayResize (EURUSD,H1)   2. ArraySize(slow)=200000 Temps passé=0 ms
   Test_ArrayResize (EURUSD,H1)   3. ArraySize(slow)=300000 Temps passé=228511 ms
*/

Voir aussi

ArrayInitialize