ArrayFree

Bir dinamik dizinin tamponunu (arabelleğini) boşaltır ve sıfır boyutunun büyüklüğünü 0 olarak ayarlar.

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

Parametreler

array[]

[in]  Dinamik dizi.

Dönüş değeri

Dönüş değeri yok.

Not

Kullanılan tüm hafızanın tek seferde boşaltıldığı ve dizilerle yapılan ana çalışmanın, gösterge tamponlarına erişimi de kapsadığı göz önüne alındığında, ArrayFree() fonksiyonunun kullanım gereksinimi çok sık görülmeyebilir. Tampon boyutları terminalin yönetim alt sistemi tarafından otomatik olarak yönetilir.

Uygulamanın kompleks dinamik ortamında kullanılan hafızanın kullanıcı tarafından yönetilmesi gerektiğinde, ArrayFree() fonksiyonu kullanıcının gereksiz dizilerle işgal edilmiş hafızayı anında ve net şekilde boşaltmasını sağlar.

Örnek:

#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>
#include <Controls\Label.mqh>
#include <Controls\ComboBox.mqh>
//--- ön tanımlı sabitler
#define X_START 0
#define Y_START 0
#define X_SIZE 280
#define Y_SIZE 300
//+------------------------------------------------------------------+
//| Hafıza ile çalışma amaçlı diyalog sınıfı                         |
//+------------------------------------------------------------------+
class CMemoryControl : public CAppDialog
  {
private:
   //--- dizi büyüklüğü
   int               m_arr_size;
   //--- diziler
   char              m_arr_char[];
   int               m_arr_int[];
   float             m_arr_float[];
   double            m_arr_double[];
   long              m_arr_long[];
   //--- etiketler
   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;
   //--- düğmeler
   CButton           m_button_add;
   CButton           m_button_free;
   //--- karma kutular
   CComboBox         m_combo_box_step;
   CComboBox         m_combo_box_type;
   //--- karma kutulardan dizi tipinin mevcut değeri
   int               m_combo_box_type_value;
 
public:
                     CMemoryControl(void);
                    ~CMemoryControl(void);
   //--- sınıf nesnesi oluşturma yöntemi
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
   //--- çizelge olayları işleyicisi
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
 
protected:
   //--- etiketleri oluştur
   bool              CreateLabel(CLabel &lbl,const string name,const int x,const int y,const string str,const int font_size,const int clr);
   //--- kontrol elemanlarını oluştur
   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);
   //--- olay işleyicileri
   void              OnClickButtonAdd(void);
   void              OnClickButtonFree(void);
   void              OnChangeComboBoxType(void);
   //--- mevcut dizi ile çalışma yöntemi
   void              CurrentArrayFree(void);
   bool              CurrentArrayAdd(void);
  };
//+------------------------------------------------------------------+
//| Mevcut dizinin serbest belleği                                   |
//+------------------------------------------------------------------+
void CMemoryControl::CurrentArrayFree(void)
  {
//--- dizi büyüklüğünü sıfırla
   m_arr_size=0;
//--- diziyi serbest bırak
   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);
  }  
//+------------------------------------------------------------------+
//| Mevcut dizi için bellek eklemeyi dene                            |
//+------------------------------------------------------------------+
bool CMemoryControl::CurrentArrayAdd(void)
  {
//--- kullanılan bellek fiziksel belleği aşarsa çık
   if(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)/TerminalInfoInteger(TERMINAL_MEMORY_USED)<2)
      return(false);
//--- belleği mevcut tipe göre dağıtmayı dene
   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);
//--- bellek dağıtıldı
   return(true);
  }  
//+------------------------------------------------------------------+
//| Olayların işlenmesi                                              |
//+------------------------------------------------------------------+
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)
//+------------------------------------------------------------------+
//| Yapıcı                                                           |
//+------------------------------------------------------------------+
CMemoryControl::CMemoryControl(void)
  {
  }
//+------------------------------------------------------------------+
//| Yıkıcı                                                           |
//+------------------------------------------------------------------+
CMemoryControl::~CMemoryControl(void)
  {
  }
//+------------------------------------------------------------------+
//| Sınıf nesnesi oluşturma yöntemi                                  |
//+------------------------------------------------------------------+
bool CMemoryControl::Create(const long chart,const string name,const int subwin,
                            const int x1,const int y1,const int x2,const int y2)
  {
//--- temel sınıf nesnesini oluştur
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2))
      return(false);
//--- dizgileri etiketler için hazırla
   string str_physical="Fiziksel hafıza = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)+" Mb";
   string str_total="Toplam hafıza = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)+" Mb";
   string str_available="Mevcut hafıza = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb";
   string str_used="Kullanılan hafıza = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb";
//--- etiketleri oluştur
   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,"Dizi tipi = double",12,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_array_size,"size_label",X_START+10,Y_START+130,"Dizi büyüklüğü = 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,"Tipi değiştir",10,clrBlack))
      return(false);
   if(!CreateLabel(m_lbl_add_size,"add_size_label",X_START+10,Y_START+210,"Diziye ekle",10,clrBlack))
      return(false);
//--- kontrol elemanlarını oluştur
   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);
//--- değişkeni başlat
   m_arr_size=0;
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Düğmeyi oluştur                                                  |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateButton(CButton &button,const string name,const int x,
                                  const int y,const string str,const int font_size,
                                  const int clr)
  {
//--- düğmeyi oluştur
   if(!button.Create(m_chart_id,name,m_subwin,x,y,x+50,y+20))
      return(false);
//--- metin
   if(!button.Text(str))
      return(false);
//--- font boyutu
   if(!button.FontSize(font_size))
      return(false);
//--- etiket rengi
   if(!button.Color(clr))
      return(false);
//--- düğmeyi kontrol elemanlarına ekle
   if(!Add(button))
      return(false);
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Dizi büyüklüğü için bir karma kutu oluştur                       |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxStep(void)
  {
//--- karma kutuyu oluştur
   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);
//--- elemanları karma kutuya ekle
   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);
//--- mevcut karma kutu elemanını ayarla
   if(!m_combo_box_step.SelectByValue(1000000))
      return(false);
//--- karma kutuyu kontrol elemanlarına ekle
   if(!Add(m_combo_box_step))
      return(false);
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Dizi tipi için bir karma kutu oluştur                            |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateComboBoxType(void)
  {
//--- karma kutuyu oluştur
   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);
//--- elemanları karma kutuya ekle
   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);
//--- mevcut karma kutu elemanını ayarla
   if(!m_combo_box_type.SelectByValue(3))
      return(false);
//--- mevcut durumdaki karma kutu elemanını kaydet
   m_combo_box_type_value=3;
//--- karma kutuyu kontrol elemanlarına ekle
   if(!Add(m_combo_box_type))
      return(false);
//--- başarılı çalıştırma
   return(true);
  }
//+------------------------------------------------------------------+
//| Bir etiket oluştur                                               |
//+------------------------------------------------------------------+
bool CMemoryControl::CreateLabel(CLabel &lbl,const string name,const int x,
                                 const int y,const string str,const int font_size,
                                 const int clr)
  {
//--- bir etiket oluştur
   if(!lbl.Create(m_chart_id,name,m_subwin,x,y,0,0))
      return(false);
//--- metin
   if(!lbl.Text(str))
      return(false);
//--- font boyutu
   if(!lbl.FontSize(font_size))
      return(false);
//--- renk
   if(!lbl.Color(clr))
      return(false);
//--- etiketi kontrol elemanlarına ekle
   if(!Add(lbl))
      return(false);
//--- başarılı
   return(true);
  }
//+------------------------------------------------------------------+
//| "Ekle" butonuna tıklama olayı işleyicisi                         |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonAdd(void)
  {
//--- dizi büyüklüğünü artır
   m_arr_size+=(int)m_combo_box_step.Value();
//--- mevcut dizi için belleği tahsis etmeyi dene
   if(CurrentArrayAdd())
     {
      //--- hafıza tahsis edildi, mevcut durumu ekranda göster
      m_lbl_memory_available.Text("Mevcut hafıza = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
      m_lbl_memory_used.Text("Kullanılan hafıza = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
      m_lbl_array_size.Text("Dizi büyüklüğü = "+IntegerToString(m_arr_size));
      m_lbl_error.Text("");
     }
   else
     {
      //--- hafıza tahsisi başarısız oldu, hata mesajı göster
      m_lbl_error.Text("Dizi çok büyük, hata!");
      //--- önceki dizi büyüklüğüne dön
      m_arr_size-=(int)m_combo_box_step.Value();
     }
  }
//+------------------------------------------------------------------+
//| "Boşalt" düğmesinin tıklanması olayının işleyicisi               |
//+------------------------------------------------------------------+
void CMemoryControl::OnClickButtonFree(void)
  {
//--- mevcut dizinin belleğini boşalt
   CurrentArrayFree();
//--- mevcut durumu ekranda göster
   m_lbl_memory_available.Text("Mevcut hafıza = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)+" Mb");
   m_lbl_memory_used.Text("Kullanılan hafıza = "+(string)TerminalInfoInteger(TERMINAL_MEMORY_USED)+" Mb");
   m_lbl_array_size.Text("Dizi büyüklüğü = 0");
   m_lbl_error.Text("");
  }
//+------------------------------------------------------------------+
//| Karma kutu değişimi olayının işleyicisi                          |
//+------------------------------------------------------------------+
void CMemoryControl::OnChangeComboBoxType(void)
  {
//--- dizi tipi değişmiş mi kontrol et
   if(m_combo_box_type.Value()!=m_combo_box_type_value)
     {
      //--- mevcut dizinin belleğini boşalt
      OnClickButtonFree();
      //--- başka bir dizi tipi ile çalış
      m_combo_box_type_value=(int)m_combo_box_type.Value();
      //--- yeni dizi tipini ekranda göster
      if(m_combo_box_type_value==0)
         m_lbl_array_type.Text("Dizi tipi = char");
      if(m_combo_box_type_value==1)
         m_lbl_array_type.Text("Dizi tipi = int");
      if(m_combo_box_type_value==2)
         m_lbl_array_type.Text("Dizi tipi = float");
      if(m_combo_box_type_value==3)
         m_lbl_array_type.Text("Dizi tipi = double");
      if(m_combo_box_type_value==4)
         m_lbl_array_type.Text("Dizi tipi = long");
     }
  }
//--- CMemoryControl sınıf nesnesi
CMemoryControl ExtDialog;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- diyaloğu oluştur
   if(!ExtDialog.Create(0,"MemoryControl",0,X_START,Y_START,X_SIZE,Y_SIZE))
      return(INIT_FAILED);
//--- çalıştır
   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);
  }