ArrayFree

Libera il buffer di qualsiasi array dinamico ed imposta il valore della dimensione zero a 0.

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

Parametri

array[]

[in] Array Dinamico.

Valore restituito

Nessun valore restituito.

Nota

La necessità di utilizzare la funzione ArrayFree() potrebbe non presentarsi troppo spesso considerando che tutta la memoria utilizzata viene liberata tutt'in una volta ed il lavoro principale con gli array comprende l'accesso ai buffer indicatore. Le grandezze dei buffer sono gestite automaticamente dal sottosistema esecutivo del terminale.

In caso sia necessario gestire manualmente la memoria in un complesso ambiente dinamico dell'applicazione, la funzione ArrayFree() consente di liberare la memoria occupata dal già inutile array dinamico, esplicitamente ed immediatamente.

Esempio:

#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <Controls\ComboBox.mqh>
//--- costanti predefinite
#define X_START 0
#define Y_START 0
#define X_SIZE 280
#define Y_SIZE 300
//+--------------------------------------------------------------------------------+
//| Classe dialogo per lavorare con la memoria                                     |
//+--------------------------------------------------------------------------------+
class CMemoryControl : public CAppDialog
  {
private:
   //--- grandezza array
   int               m_arr_size;
   //--- arrays
   char              m_arr_char[];
   int               m_arr_int[];
   float             m_arr_float[];
   double            m_arr_double[];
   long              m_arr_long[];
   //--- etichette
   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;
   //--- bottoni
   CButton           m_button_add;
   CButton           m_button_free;
   //--- combo boxes
   CComboBox         m_combo_box_step;
   CComboBox         m_combo_box_type;
   //--- valore corrente del tipo di array dalla combo box
   int               m_combo_box_type_value;
 
public:
                     CMemoryControl(void);
                    ~CMemoryControl(void);
   //--- metodo di creazione della classe object
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- handler dell'evento chart
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
 
protected:
   //--- crea etichette
   bool              CreateLabel(CLabel &lbl,const string name,const int x,const int y,const string str,const int font_size,const int clr);
   //--- crea elementi di controllo
   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);
   //--- event handlers
   void              OnClickButtonAdd(void);
   void              OnClickButtonFree(void);
   void              OnChangeComboBoxType(void);
   //--- metodi per lavorare con il corrente array
   void              CurrentArrayFree(void);
   bool              CurrentArrayAdd(void);
  };
//+--------------------------------------------------------------------------------+
//| Memoria libera dell'array corrente                                             |
//+--------------------------------------------------------------------------------+
void CMemoryControl::CurrentArrayFree(void)
  {
//--- resetta la grandezza dell'array
   m_arr_size=0;
//--- libera l'array
   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);
  }  
//+--------------------------------------------------------------------------------+
//| Tenta di aggiungere memoria al corrente array                                  |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::CurrentArrayAdd(void)
  {
//--- esce se la grandezza della memoria utilizzata supera la grandezza della memoria fisica
   if(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)/TerminalInfoInteger(TERMINAL_MEMORY_USED)<2)
      return(false);
//--- tentativo di allocare memoria secondo il tipo corrente
   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);
//--- memoria allocata
   return(true);
  }  
//+--------------------------------------------------------------------------------+
//| Events handling                                                                |
//+--------------------------------------------------------------------------------+
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)
//+--------------------------------------------------------------------------------+
//| Costruttore                                                                    |
//+--------------------------------------------------------------------------------+
CMemoryControl::CMemoryControl(void)
  {
  }
//+--------------------------------------------------------------------------------+
//| Distruttore                                                                    |
//+--------------------------------------------------------------------------------+
CMemoryControl::~CMemoryControl(void)
  {
  }
//+--------------------------------------------------------------------------------+
//| Metodo di creazione oggetto della 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)
  {
//--- crea l'oggetto della classe base
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- prepara le stringhe per le etichette
   string str_physical="Memory physical = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)+" Mb";
   string str_total="Memory total = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)+" Mb";
   string str_available="Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb";
   string str_used="Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb";
//--- crea le etichette 
   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,"Array type = 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);
//--- crea elementi di controllo
   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);
//--- inizializza la variabile
   m_arr_size=0;
//--- esecuzione avvenuta
   return(true);
  }
//+--------------------------------------------------------------------------------+
//| Crea il bottone                                                                |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::CreateButton(CButton &button,const string name,const int x,
                                  const int y,const string str,const int font_size,
                                  const int clr)
  {
//--- crea il bottone
   if(!button.Create(m_chart_id,name,m_subwin,x,y,x+50,y+20))
      return(false);
//--- testo
   if(!button.Text(str))
      return(false);
//--- grandezza del font
   if(!button.FontSize(font_size))
      return(false);
//--- colore dell'etichetta
   if(!button.Color(clr))
      return(false);
//--- aggiunge il bottone agli elementi di controllo
   if(!Add(button))
      return(false);
//--- esecuzione avvenuta
   return(true);
  }
//+--------------------------------------------------------------------------------+
//| Crea un box combo per la grandezza dell'array                                  |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxStep(void)
  {
//--- crea il combo box
   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);
//--- aggiunge elementi al combo box
   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);
//--- imposta gli elementi correnti del combo box
   if(!m_combo_box_step.SelectByValue(1000000))
      return(false);
//--- aggiunge il combo box agli elementi di controllo
   if(!Add(m_combo_box_step))
      return(false);
//--- esecuzione avvenuta
   return(true);
  }
//+--------------------------------------------------------------------------------+
//| Crea un combo box per il tipo di array                                         |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxType(void)
  {
//--- crea il combo box
   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);
//--- aggiunge elementi al combo box
   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);
//--- imposta gli elementi correnti del combo box
   if(!m_combo_box_type.SelectByValue(3))
      return(false);
//--- memorizza i correnti elementi del combo box
   m_combo_box_type_value=3;
//--- aggiunge il combo box agli elementi di controllo
   if(!Add(m_combo_box_type))
      return(false);
//--- esecuzione avvenuta
   return(true);
  }
//+--------------------------------------------------------------------------------+
//| Crea un etichetta                                                              |
//+--------------------------------------------------------------------------------+
bool CMemoryControl::CreateLabel(CLabel &lbl,const string name,const int x,
                                 const int y,const string str,const int font_size,
                                 const int clr)
  {
//--- crea un'etichetta
   if(!lbl.Create(m_chart_id,name,m_subwin,x,y,0,0))
      return(false);
//--- testo
   if(!lbl.Text(str))
      return(false);
//--- grandezza del font
   if(!lbl.FontSize(font_size))
      return(false);
//--- colore
   if(!lbl.Color(clr))
      return(false);
//--- aggiunge l'etichetta agli elementi di controllo
   if(!Add(lbl))
      return(false);
//--- avvenuto
   return(true);
  }
//+--------------------------------------------------------------------------------+
//| Handler dell'evento di click del bottone "Aggiungi"                            |
//+--------------------------------------------------------------------------------+
void CMemoryControl::OnClickButtonAdd(void)
  {
//--- incrementa la grandezza dell'array
   m_arr_size+=(int)m_combo_box_step.Value();
//--- tentativo di allocare memoria per l'array corrente
   if(CurrentArrayAdd())
     {
      //--- memoria allocata, visualizza lo status corrente sullo schermo
      m_lbl_memory_available.Text("Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
      m_lbl_memory_used.Text("Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
      m_lbl_array_size.Text("Array size = "+IntegerToString(m_arr_size));
      m_lbl_error.Text("");
     }
   else
     {
      //--- fallimento nell'allocazione di memoria, visualizza il messaggio d'errore
      m_lbl_error.Text("Array is too large, error!");
      //--- restituisce la precedente grandezza dell'array
      m_arr_size-=(int)m_combo_box_step.Value();
     }
  }
//+--------------------------------------------------------------------------------+
//| Handler dell'evento di click del bottone "Libera"                              |
//+--------------------------------------------------------------------------------+
void CMemoryControl::OnClickButtonFree(void)
  {
//--- Liberare la memoria dall'array corrente
   CurrentArrayFree();
//--- visualizza lo status corrente sullo schermo
   m_lbl_memory_available.Text("Memory available = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
   m_lbl_memory_used.Text("Memory used = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
   m_lbl_array_size.Text("Array size = 0");
   m_lbl_error.Text("");
  }
//+--------------------------------------------------------------------------------+
//| Handler del cambio evento del combo box                                        |
//+--------------------------------------------------------------------------------+
void CMemoryControl::OnChangeComboBoxType(void)
  {
//--- verifica se il tipo dell' array è cambiato
   if(m_combo_box_type.Value()!=m_combo_box_type_value)
     {
      //--- libera la memoria dell'array corrente
      OnClickButtonFree();
      //--- lavora con un altro tipo di array
      m_combo_box_type_value=(int)m_combo_box_type.Value();
      //--- visualizza il nuovo tipo di array sullo schermo
      if(m_combo_box_type_value==0)
         m_lbl_array_type.Text("Array type = char");
      if(m_combo_box_type_value==1)
         m_lbl_array_type.Text("Array type = int");
      if(m_combo_box_type_value==2)
         m_lbl_array_type.Text("Array type = float");
      if(m_combo_box_type_value==3)
         m_lbl_array_type.Text("Array type = double");
      if(m_combo_box_type_value==4)
         m_lbl_array_type.Text("Array type = long");
     }
  }
//--- Oggetto della classe CMemoryControl
CMemoryControl ExtDialog;
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione dell' Expert                                      |
//+--------------------------------------------------------------------------------+
int OnInit()
  {
//--- crea il dialogo
   if(!ExtDialog.Create(0,"MemoryControl",0,X_START,Y_START,X_SIZE,Y_SIZE))
      return(INIT_FAILED);
//--- lancia
   ExtDialog.Run();
//---
   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------+
//| Funzione deinizializzazione Expert                                             |
//+--------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ExtDialog.Destroy(reason);
  }
//+--------------------------------------------------------------------------------+
//| Funzione Expert evento chart                                                   |
//+--------------------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }