ArrayFree

Befreit Puffer jedes dynamischen Arrays und stellt die Größe der Null-Dimension auf 0 ein.

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

Parameter

array[]

[in]  Dynamisches Array.

Rückgabewert

keinen Rückgabewert.

Anmerkung

Bei der Schreibung des Skripts und der Indikatoren können eine Notwendigkeit im Einführung der ArrayFree() Funktion nicht so oft entstehen, denn am Ende des Skripts der gesamte verwendete Speicher sofort befreit wird und in den benutzereigen Indikatoren stellt die Grundarbeit mit den Arrays den Zugriff auf die Indikator Puffers, deren Größe wird von der bearbeiten Subsystem des Terminals automatisch schaffen.

Wenn das Programm braucht, um Speicher in den komplizierten dynamischen Bedingungen zu verwalten, so wird die ArrayFree () Funktion offensichtlich und sofort selbständig der Speicher zu befreien, der mit dem schon nutzlos dynamischen Array beschäftigt ist.

Beispiel:

#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <Controls\ComboBox.mqh>
// --- vorbestimmte Konstanten
#define X_START 0
#define Y_START 0
#define X_SIZE 280
#define Y_SIZE 300
//+------------------------------------------------------------------+
//| Die Klasse des Dialoges für Arbeit mit dem Speichern             |
//+------------------------------------------------------------------+
class CMemoryControl : public CAppDialog
  {
private:
   //--- die Größe des Arrays
   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[];
   //--- Beschriftungen
   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;
   //--- Schaltflächen
   CButton           m_button_add;
   CButton           m_button_free;
   // --- Listen
   CComboBox         m_combo_box_step;
   CComboBox         m_combo_box_type;
   // --- der aktuelle Wert des Array-Typ aus der Liste
   int               m_combo_box_type_value;
 
public:
                     CMemoryControl(void);
                    ~CMemoryControl(void);
   //--- Methode der Erzeugung eines Objekts der Klasse
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- der Bearbeiter des Ereignisses von Chart
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
 
protected:
   //--- erstellen Sie der Beschriftung
   bool              CreateLabel(CLabel &lbl,const string name,const int x,const int y,const string str,const int font_size,const int clr);
   //--- erstellen Sie die Steuerelemente
   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);
   //--- der Bearbeiter des Ereignisses
   void              OnClickButtonAdd(void);
   void              OnClickButtonFree(void);
   void              OnChangeComboBoxType(void);
   //--- die Methoden der Arbeit mit dem aktuellen Array
   void              CurrentArrayFree(void);
   bool              CurrentArrayAdd(void);
  };
//+------------------------------------------------------------------+
//| Die Befreiung den Speichern des aktuellen Arrays                 |
//+------------------------------------------------------------------+
void CMemoryControl::CurrentArrayFree(void)
  {
//--- Rückstellung der Größe des Arrays
   m_arr_size=0;
//--- die Befreiung des Arrays
   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);
  }  
//+------------------------------------------------------------------+
//| Die Unternehmung den Speichern für den aktuelle Arrays hinzufügen|
//+------------------------------------------------------------------+
bool CMemoryControl::CurrentArrayAdd(void)
  {
//--- wenn die Größe der verwendeten Speicher ist mehr als die Größe des physikalischen Speichers, dann gehen wir hinaus.
   if(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)/TerminalInfoInteger(TERMINAL_MEMORY_USED)<2)
      return(false);
//--- die Unternehmung den Speichern abhängig von dem aktuellen Typ zu wählen
   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);
//--- der Speicher ist gewählt
   return(true);
  }  
//+------------------------------------------------------------------+
//| Der Bearbeitung des Ereignisses                                  |
//+------------------------------------------------------------------+
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)
//+------------------------------------------------------------------+
//| Konstrukteur                                                     |
//+------------------------------------------------------------------+
CMemoryControl::CMemoryControl(void)
  {
  }
//+------------------------------------------------------------------+
//| Destrukteur                                                      |
//+------------------------------------------------------------------+
CMemoryControl::~CMemoryControl(void)
  {
  }
//+------------------------------------------------------------------+
//| Methode der Erzeugung eines Objekts der Klasse                   |
//+------------------------------------------------------------------+
bool CMemoryControl::Create(const long chart,const string name,const int subwin,
                            const int x1,const int y1,const int x2,const int y2)
  {
//--- der Erzeugung eines Objekts der grundlegende Klasse
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- die Vorbereitung die Zeilen für die Beschriftungen
   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";
//--- erstellen Sie die Beschriftungen
   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);
//--- erstellen Sie das Steuerelement
   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);
//--- die Initialisierung der Variablen
   m_arr_size=0;
//--- die erfolgreiche Ausführung
   return(true);
  }
//+------------------------------------------------------------------+
//| Erstellen Sie die Schaltfläche                                   |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateButton(CButton &button,const string name,const int x,
                                  const int y,const string str,const int font_size,
                                  const int clr)
  {
//--- erstellen Sie die Schaltfläche
   if(!button.Create(m_chart_id,name,m_subwin,x,y,x+50,y+20))
      return(false);
//--- der Text
   if(!button.Text(str))
      return(false);
//--- der Schriftgröße
   if(!button.FontSize(font_size))
      return(false);
//--- die Farbe der Beschriftung
   if(!button.Color(clr))
      return(false);
//--- fügen Sie die Schaltfläche in den Kontrolelementen hinzu
   if(!Add(button))
      return(false);
//--- die erfolgreiche Ausführung
   return(true);
  }
//+------------------------------------------------------------------+
//| Erstellen Sie die Liste für die Größe des Arrays                 |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxStep(void)
  {
//--- erstellen Sie die 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);
//--- fügen Sie die Elemente in die Liste hinzu
   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);
//--- stellen Sie das aktuelle Element der Liste ein
   if(!m_combo_box_step.SelectByValue(1000000))
      return(false);
//--- fügen Sie die Liste in die Kontrolelemente hinzu
   if(!Add(m_combo_box_step))
      return(false);
//--- die erfolgreiche Ausführung
   return(true);
  }
//+------------------------------------------------------------------+
//| Erstellen Sie die Liste für den Typ des Arrays                   |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxType(void)
  {
//--- erstellen Sie die 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);
//--- fügen Sie die Elemente in die Liste hinzu
   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);
//--- stellen Sie das aktuelle Element der Liste ein
   if(!m_combo_box_type.SelectByValue(3))
      return(false);
//--- behalten Sie das aktuelle Element der Liste
   m_combo_box_type_value=3;
//--- fügen Sie die Liste in die Kontrolelemente hinzu
   if(!Add(m_combo_box_type))
      return(false);
//--- die erfolgreiche Ausführung
   return(true);
  }
//+------------------------------------------------------------------+
//| Erstellen Sie der Beschriftung                                   |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateLabel(CLabel &lbl,const string name,const int x,
                                 const int y,const string str,const int font_size,
                                 const int clr)
  {
//--- erstellen Sie der Beschriftung
   if(!lbl.Create(m_chart_id,name,m_subwin,x,y,0,0))
      return(false);
//--- der Text
   if(!lbl.Text(str))
      return(false);
//--- der Schriftgröße
   if(!lbl.FontSize(font_size))
      return(false);
//--- die Farbe
   if(!lbl.Color(clr))
      return(false);
//--- fügen Sie der Beschriftung in die Kontrolelemente hinzu
   if(!Add(lbl))
      return(false);
//--- erfolgreichs sein
   return(true);
  }
//+------------------------------------------------------------------+
//| Der Bearbeiter des Ereignisses auf die "Add" Schaltfläche zu     |
//| klicken                                                          |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonAdd(void)
  {
//--- erhöhen Sie die Größe des Arrays
   m_arr_size+=(int)m_combo_box_step.Value();
//--- versuchen Sie der Speicher für den aktuellen Array zu wählen
   if(CurrentArrayAdd())
     {
      //--- der Speicher ist gewählt, führen wir den aktuellen Zustand an dem Chart heraus
      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
     {
      //--- es misslang, der Speicher zu wählen, führen Sie die Nachtrichtung vom Fehler heraus
      m_lbl_error.Text("Array is too large, error!");
      //--- geben Sie die vorherige Größe des Arrays zurück
      m_arr_size-=(int)m_combo_box_step.Value();
     }
  }
//+------------------------------------------------------------------+
//| Der Bearbeiter des Ereignisses auf die "Free" Schaltfläche zu    |
//| klicken                                                          |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonFree(void)
  {
//--- befreien Sie den Speichern des aktuellen Arrays
   CurrentArrayFree();
//--- führen wir den aktuellen Zustand an dem Chart heraus
   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("");
  }
//+------------------------------------------------------------------+
//| Der Bearbeiter des Ereignisses der Änderungsliste                |
//+------------------------------------------------------------------+
void CMemoryControl::OnChangeComboBoxType(void)
  {
//--- prüfen Sie, ob sich der Typ von Array geändert hat
   if(m_combo_box_type.Value()!=m_combo_box_type_value)
     {
      //--- befreien Sie den Speicher des aktuellen Arrays
      OnClickButtonFree();
      //--- arbeiten sie mit dem anderen Typ von Array
      m_combo_box_type_value=(int)m_combo_box_type.Value();
      //--- führen wir den neuen Typ des Arrays an dem Chart heraus
      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");
     }
  }
//--- das Objekt der Klasse von CMemoryControl
CMemoryControl ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- erstellen Sie das Dialog
   if(!ExtDialog.Create(0,"MemoryControl",0,X_START,Y_START,X_SIZE,Y_SIZE))
      return(INIT_FAILED);
//--- der Start
   ExtDialog.Run();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ExtDialog.Destroy(reason);
  }
//+------------------------------------------------------------------+
//| Expert chart event function                                      |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   ExtDialog.ChartEvent(id,lparam,dparam,sparam);
  }