ArrayFree

La fonction libère le buffer d'un tableau dynamique et définit la taille de la dimension 0 (la première dimension) à 0.

void  ArrayFree(
   void&  array[]      // tableau
   );

Paramètres

array[]

[in]  Tableau dynamique.

Valeur de Retour

Aucune valeur de retour.

Note

Le besoin d'utiliser la fonction ArrayFree() n'apparaît pas très souvent si l'on considère que toute la mémoire utilisée est libérée en une fois et que l'utilisation d'un tableau comprend l'accès aux buffers de l'indicateur. Les tailles des buffers sont automatiquement gérées par le système d'exécution du terminal.

S'il est nécessaire de gérer manuellement la mémoire dans un environnement dynamique complexe de l'application, la fonction ArrayFree() permet aux utilisateur de libérer la mémoire occupée par le tableau qui n'est plus nécessaire de façon explicite et immédiatement.

Exemple :

#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <Controls\ComboBox.mqh>
//--- constantes prédéfinies
#define X_START 0
#define Y_START 0
#define X_SIZE 280
#define Y_SIZE 300
//+------------------------------------------------------------------+
//| Classe de dialogue pour travailler avec la mémoire               |
//+------------------------------------------------------------------+
class CMemoryControl : public CAppDialog
  {
private:
   //--- taille du tableau
   int               m_arr_size;
   //--- tableaux
   char              m_arr_char[];
   int               m_arr_int[];
   float             m_arr_float[];
   double            m_arr_double[];
   long              m_arr_long[];
   //--- étiquettes
   CLabel            m_lbl_memory_physical;
   CLabel            m_lbl_memory_total;
   CLabel            m_lbl_memory_available;
   CLabel            m_lbl_memory_used;
   CLabel            m_lbl_array_size;
   CLabel            m_lbl_array_type;
   CLabel            m_lbl_error;
   CLabel            m_lbl_change_type;
   CLabel            m_lbl_add_size;
   //--- boutons
   CButton           m_button_add;
   CButton           m_button_free;
   //--- listes
   CComboBox         m_combo_box_step;
   CComboBox         m_combo_box_type;
   //--- valeur actuelle du type du tableau pour la liste
   int               m_combo_box_type_value;
 
public:
                     CMemoryControl(void);
                    ~CMemoryControl(void);
   //--- méthode de création de l'objet de classe
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- gestionnaire d'évènements du graphique
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
 
protected:
   //--- crée les étiquettes
   bool              CreateLabel(CLabel &lbl,const string name,const int x,const int y,const string str,const int font_size,const int clr);
   //--- crée les éléments de contrôle
   bool              CreateButton(CButton &button,const string name,const int x,const int y,const string str,const int font_size,const int clr);
   bool              CreateComboBoxStep(void);
   bool              CreateComboBoxType(void);
   //--- gestionnaires d'évènements
   void              OnClickButtonAdd(void);
   void              OnClickButtonFree(void);
   void              OnChangeComboBoxType(void);
   //--- méthodes d'utilisation du tableau actuel
   void              CurrentArrayFree(void);
   bool              CurrentArrayAdd(void);
  };
//+------------------------------------------------------------------+
//| Libère la mémoire du tableau actuel                              |
//+------------------------------------------------------------------+
void CMemoryControl::CurrentArrayFree(void)
  {
//--- réinitialise la taille du tableau
   m_arr_size=0;
//--- libère le tableau
   if(m_combo_box_type_value==0)
      ArrayFree(m_arr_char);
   if(m_combo_box_type_value==1)
      ArrayFree(m_arr_int);
   if(m_combo_box_type_value==2)
      ArrayFree(m_arr_float);
   if(m_combo_box_type_value==3)
      ArrayFree(m_arr_double);
   if(m_combo_box_type_value==4)
      ArrayFree(m_arr_long);
  }  
//+------------------------------------------------------------------+
//| Tentative d'ajout de mémoire au tableau actuel                   |
//+------------------------------------------------------------------+
bool CMemoryControl::CurrentArrayAdd(void)
  {
//--- sort si la taille de la mémoire utilisée est supérieure à la taille de la mémoire physique
   if(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)/TerminalInfoInteger(TERMINAL_MEMORY_USED)<2)
      return(false);
//--- tentative d'allocation de la mémoire selon le type courant
   if(m_combo_box_type_value==0 && ArrayResize(m_arr_char,m_arr_size)==-1)
      return(false);
   if(m_combo_box_type_value==1 && ArrayResize(m_arr_int,m_arr_size)==-1)
      return(false);
   if(m_combo_box_type_value==2 && ArrayResize(m_arr_float,m_arr_size)==-1)
      return(false);
   if(m_combo_box_type_value==3 && ArrayResize(m_arr_double,m_arr_size)==-1)
      return(false);
   if(m_combo_box_type_value==4 && ArrayResize(m_arr_long,m_arr_size)==-1)
      return(false);
//--- mémoire allouée
   return(true);
  }  
//+------------------------------------------------------------------+
//| Gestion des évènements                                           |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CMemoryControl)
ON_EVENT(ON_CLICK,m_button_add,OnClickButtonAdd)
ON_EVENT(ON_CLICK,m_button_free,OnClickButtonFree)
ON_EVENT(ON_CHANGE,m_combo_box_type,OnChangeComboBoxType)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| Constructeur                                                     |
//+------------------------------------------------------------------+
CMemoryControl::CMemoryControl(void)
  {
  }
//+------------------------------------------------------------------+
//| Destructeur                                                      |
//+------------------------------------------------------------------+
CMemoryControl::~CMemoryControl(void)
  {
  }
//+------------------------------------------------------------------+
//| Méthode de création d'un objet de la classe                      |
//+------------------------------------------------------------------+
bool CMemoryControl::Create(const long chart,const string name,const int subwin,
                            const int x1,const int y1,const int x2,const int y2)
  {
//--- crée un objet de la classe de base
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- prépare les chaînes de caractères des étiquettes
   string str_physical="Mémoire physique = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)+" Mo";
   string str_total="Mémoire totale = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)+" Mo";
   string str_available="Mémoire disponible = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mo";
   string str_used="Mémoire utilisée = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mo";
//--- crée les étiquettes
   if(!CreateLabel(m_lbl_memory_physical,"physical_label",X_START+10,Y_START+5,str_physical,12,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_memory_total,"total_label",X_START+10,Y_START+30,str_total,12,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_memory_available,"available_label",X_START+10,Y_START+55,str_available,12,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_memory_used,"used_label",X_START+10,Y_START+80,str_used,12,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_array_type,"type_label",X_START+10,Y_START+105,"Type de tableau = double",12,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_array_size,"size_label",X_START+10,Y_START+130,"Array size = 0",12,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_error,"error_label",X_START+10,Y_START+155,"",12,clrRed))
      return(false);
   if(!CreateLabel(m_lbl_change_type,"change_type_label",X_START+10,Y_START+185,"Change type",10,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_add_size,"add_size_label",X_START+10,Y_START+210,"Add to array",10,clrBlack))
      return(false);
//--- crée les éléments de contrôle
   if(!CreateButton(m_button_add,"add_button",X_START+15,Y_START+245,"Add",12,clrBlue))
      return(false);
   if(!CreateButton(m_button_free,"free_button",X_START+75,Y_START+245,"Free",12,clrBlue))
      return(false);
   if(!CreateComboBoxType())
      return(false);
   if(!CreateComboBoxStep())
      return(false);
//--- initialise la variable
   m_arr_size=0;
//--- exécution réussie
   return(true);
  }
//+------------------------------------------------------------------+
//| Crée le bouton                                                   |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateButton(CButton &button,const string name,const int x,
                                  const int y,const string str,const int font_size,
                                  const int clr)
  {
//--- crée le bouton
   if(!button.Create(m_chart_id,name,m_subwin,x,y,x+50,y+20))
      return(false);
//--- texte
   if(!button.Text(str))
      return(false);
//--- taille de la police de caractères
   if(!button.FontSize(font_size))
      return(false);
//--- couleur de l'étiquette
   if(!button.Color(clr))
      return(false);
//--- ajoute le bouton aux éléments de contrôle
   if(!Add(button))
      return(false);
//--- exécution réussie
   return(true);
  }
//+------------------------------------------------------------------+
//| Crée une liste pour la taille du tableau                         |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxStep(void)
  {
//--- crée la liste
   if(!m_combo_box_step.Create(m_chart_id,"step_combobox",m_subwin,X_START+100,Y_START+185,X_START+200,Y_START+205))
      return(false);
//--- ajoute des éléments à la liste
   if(!m_combo_box_step.ItemAdd("100 000",100000))
      return(false);
   if(!m_combo_box_step.ItemAdd("1 000 000",1000000))
      return(false);
   if(!m_combo_box_step.ItemAdd("10 000 000",10000000))
      return(false);
   if(!m_combo_box_step.ItemAdd("100 000 000",100000000))
      return(false);
//--- définit l'élément courant de la liste
   if(!m_combo_box_step.SelectByValue(1000000))
      return(false);
//--- ajoute la liste aux éléments de contrôle
   if(!Add(m_combo_box_step))
      return(false);
//--- exécution réussie
   return(true);
  }
//+------------------------------------------------------------------+
//| Crée une liste pour le type du tableau                           |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxType(void)
  {
//--- crée la liste
   if(!m_combo_box_type.Create(m_chart_id,"type_combobox",m_subwin,X_START+100,Y_START+210,X_START+200,Y_START+230))
      return(false);
//--- ajoute des éléments à la liste
   if(!m_combo_box_type.ItemAdd("char",0))
      return(false);
   if(!m_combo_box_type.ItemAdd("int",1))
      return(false);
   if(!m_combo_box_type.ItemAdd("float",2))
      return(false);
   if(!m_combo_box_type.ItemAdd("double",3))
      return(false);
   if(!m_combo_box_type.ItemAdd("long",4))
      return(false);
//--- définit l'élément courant de la liste
   if(!m_combo_box_type.SelectByValue(3))
      return(false);
//--- stocke l'élément courant de la liste
   m_combo_box_type_value=3;
//--- ajoute la liste aux éléments de contrôle
   if(!Add(m_combo_box_type))
      return(false);
//--- exécution réussie
   return(true);
  }
//+------------------------------------------------------------------+
//| Crée une étiquette                                               |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateLabel(CLabel &lbl,const string name,const int x,
                                 const int y,const string str,const int font_size,
                                 const int clr)
  {
//--- crée une étiquette
   if(!lbl.Create(m_chart_id,name,m_subwin,x,y,0,0))
      return(false);
//--- texte
   if(!lbl.Text(str))
      return(false);
//--- taille de la police de caractères
   if(!lbl.FontSize(font_size))
      return(false);
//--- couleur
   if(!lbl.Color(clr))
      return(false);
//--- ajoute l'étiquette aux éléments de contrôle
   if(!Add(lbl))
      return(false);
//--- succès
   return(true);
  }
//+------------------------------------------------------------------+
//| Gestionnaire d'évènement de clic sur le bouton "Ajouter"         |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonAdd(void)
  {
//--- augmente la taille du tableau
   m_arr_size+=(int)m_combo_box_step.Value();
//--- tentative d'allocation mémoire pour le tableau actuel
   if(CurrentArrayAdd())
     {
      //--- mémoire allouée, affiche le statut courant à l'écran
      m_lbl_memory_available.Text("Mémoire disponible = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mo");
      m_lbl_memory_used.Text("Mémoire utilisée = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mo");
      m_lbl_array_size.Text("Taille du tableau = "+IntegerToString(m_arr_size));
      m_lbl_error.Text("");
     }
   else
     {
      //--- échec d'allocation de la mémoire, affiche le message d'erreur
      m_lbl_error.Text("Le tableau est trop grand, erreur !");
      //--- retourne la taille précédente du tableau
      m_arr_size-=(int)m_combo_box_step.Value();
     }
  }
//+------------------------------------------------------------------+
//| Gestionnaire d'évènement de clic sur le bouton "Libérer"         |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonFree(void)
  {
//--- libère la mémoire du tableau actuel
   CurrentArrayFree();
//--- affiche le statut actuel à l'écran
   m_lbl_memory_available.Text("Mémoire disponible = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mo");
   m_lbl_memory_used.Text("Mémoire utilisée = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mo");
   m_lbl_array_size.Text("Taille du tableau = 0");
   m_lbl_error.Text("");
  }
//+------------------------------------------------------------------+
//| Gestionnaire d'évènement de changement de la liste               |
//+------------------------------------------------------------------+
void CMemoryControl::OnChangeComboBoxType(void)
  {
//--- vérifie si le type du tableau a changé
   if(m_combo_box_type.Value()!=m_combo_box_type_value)
     {
      //--- libère la mémoire du tableau actuel
      OnClickButtonFree();
      //--- utilise un autre type de tableau
      m_combo_box_type_value=(int)m_combo_box_type.Value();
      //--- affiche le nouveau type de tableau à l'écran
      if(m_combo_box_type_value==0)
         m_lbl_array_type.Text("Type de tableau = char");
      if(m_combo_box_type_value==1)
         m_lbl_array_type.Text("Type de tableau = int");
      if(m_combo_box_type_value==2)
         m_lbl_array_type.Text("Type de tableau = float");
      if(m_combo_box_type_value==3)
         m_lbl_array_type.Text("Type de tableau = double");
      if(m_combo_box_type_value==4)
         m_lbl_array_type.Text("Type de tableau = long");
     }
  }
//--- Objet de type CMemoryControl
CMemoryControl ExtDialog;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- crée la boîte de dialogue
   if(!ExtDialog.Create(0,"MemoryControl",0,X_START,Y_START,X_SIZE,Y_SIZE))
      return(INIT_FAILED);
//--- lancement
   ExtDialog.Run();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Fonction de dé-initialisation de l'expert                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Fonction d'évènement graphique de l'expert                       |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }