"MQL5 Programlama Temelleri: Diziler" makalesi için tartışma - sayfa 2

 
Çok faydalı ve iyi açıklanmış bir makale, teşekkürler Dmitry Fedoseev.
 
Bir fonksiyondan bir dizi nasıl döndürülür? Geçici bir çözüm buldum, ancak açıkçası bunu "kafa kafaya" yapmanın bir yolu olmalı )).
 
thejobber:
Bir fonksiyondan bir dizi nasıl döndürülür? Şimdiye kadar geçici bir çözüm buldum, ancak açıkçası bunu "kafa kafaya" yapmanın bir yolu olmalı )).

Bunu yapmanın bir yolu yok... diziye bir işaretçi dışında. Örneğin:

CArrayDouble *Function(void);

Kafa kafaya değil, ama bu bölümdeki gibi oldukça standart bir yaklaşım:

void Function(double &_arr_out[]);
Genel olarak, döndürülen dizi bir parametre referansıdır...
 

Evet, teşekkürler. Ben sadece hemen denedim

return *x; alışkanlık dışında, C++'da olduğu gibi ))

yerine

return GetPointer(x)

anladım ))

 
MetaQuotes Software Corp.:

Yeni makale MQL5 Programlama Temelleri: Diziler yayınlandı:

Yazar Dmitry Fedoseev

1 Soru:

#define  SIZE_X 3;

(...)

int ArrayName[SIZE_X];

Derleyici böyle bir yapıyı yasaklar. Neden?

 
Bu uzun inceleme için çok teşekkürler
 
#import "dll.dll"
  double qwerty(double &q[]);
#import

Bir dll yapıyorum ve ona bir dizi işaretçisi aktarmak istiyorum.

Ama bunu nasıl yapacağımı bulamıyorum.

Bir sorun var.


C++'ın bir benzerine ihtiyacım var


double qwerty(double *q);

double *q;

q = yeni çift [100];

qwerty(q);


MQL5'te nasıl yapılır...

 
Mql'de dizi ne ise odur, onunla hiçbir şey yapamazsınız. Herhangi bir sorun olmamalı. Hata dll'inize yakın bir yerde. Belki de dll'de dizi boyutunu geçmelisiniz.
 

Kodunuz için teşekkürler, yazmak için bana biraz zaman kazandırdı. MQL5 Array nesnesini (double, int vb.) kullanmaya çalıştım ve sadece hayal kırıklığına uğradım. Gönderinize geldim ve dizileri yeniden boyutlandırmak için kodunuzu buldum, bu harikaydı teşekkürler. Kodunuzu herhangi bir veri türüne hitap edecek şekilde değiştirdim. Sadece Contains (Arama yöntemi) yöntemini nesneler için kullanmaya çalışmayın çünkü nesneler referans olabileceğinden çalışmayabilir, bunu test etmediğimden emin değilim. C#'ı MQL5 içinde yeniden oluşturmaya çalışıyorum, bu nedenle kısaltmalar benzer :)


Tanrı korusun !!!



// + ----------------------------------------------- ------------------- + 


// | 
CDynamicArray.mqh | 


// | 
Tamsayı | 


// | 
https://login.mql5.com/ru/users/Integer | 


// + ----------------------------------------------- ------------------- + 


#property 

copyright  

"Integer" 


#property 

link  

"https://login.mql5.com/en/users/Integer" 


// + - -------------------------------------------------- --------------- + 


// | 
| 


// + ----------------------------------------------- ------------------- + 


template 

< 

typename 

 T> 


class 

 CDynamicArray 


  { 


private 

 : 
   

int 

                m_ChunkSize;     

// Yığın boyutu 
   

int 

                m_ReservedSize; 

// Dizinin gerçek boyutu 
   

int 

                m_Size;         

// Dizideki aktif eleman sayısı 


public 

 : 


   T Element [];       

// Uygun dizi. 
Public bölümünde yer alır, 
                                     

// böylece gerekirse doğrudan kullanabiliriz 
   

// + --------------------------- --------------------------------------- + 
   

| 
Kurucu | 
   

// + ----------------------------------------------- ------------------- + 
   

void 

 CDynamicArray ( 

int 

 ChunkSize = 

1024 

 ) 


     { 


      m_Size = 

0 

 ;                             

// Aktif eleman sayısı 


       m_ChunkSize = ChunkSize;               

// Yığın boyutu 


       m_ReservedSize = ChunkSize;             

// Dizinin gerçek boyutu 
      

ArrayResize 

 (Element, m_ReservedSize); 

// Diziyi hazırlayın 


      } 
   

// + ----------------------------------------- ------------------------- + 
   

// | 
Dizinin sonuna bir eleman ekleme işlevi | 
   

// + ----------------------------------------------- ------------------- + 
   

void 

 Add (T Value) 


     { 


      m_Size ++; 

// Etkin öğe sayısını artırın 
      

if 

 (m_Size> m_ReservedSize) 


        { 

// İstenen sayı gerçek dizi boyutundan daha büyüktür 


          m_ReservedSize + = m_ChunkSize; 

// Yeni dizi boyutunu hesapla 
         

ArrayResize 

 (Element, m_ReservedSize); 

// Gerçek dizi boyutunu artırın 


         } 


      Element [m_Size- 

1 

 ] = Value; 

// Değeri ekleyin 


      } 
     
     

void 

 Set ( 

int 

 index, T Value) 


     { 


      m_Size ++; 

// Etkin öğe sayısını artırın 
      

if 

 (m_Size <index) 


        { 
         

return 

 ; 


        } 


      Element [index] = Value; 

// Değeri ekleyin 


      } 
   

// + ----------------------------------------- ------------------------- + 
   

// | 
Dizideki aktif eleman sayısını elde eden fonksiyon | 
   

// + ----------------------------------------------- ------------------- + 
   

int 

 Count () 


     { 
      

return 

 (m_Size); 


     } 
   


   T 

operator 

 [] ( 

const  

int 

 index) 

const 

 { 

return 

 Element [index]; 
} 
   
   

bool 

Contains (T itemToFind) 


   { 
      

for 

 ( 

int 

 i = 

0 

 ; i <Count (); i ++) 


        { 
            

if 

 (Element [i] == itemToFind) 


            { 
               

return  

true 

 ; 


            } 


        } 
        
      

return  

false 

 ; 


   } 
   
   

int 

 IndexOf (T itemToFind) 


   { 
      

for 

 ( 

int 

 i = 

0 

 ; i <Count (); i ++) 


        { 
            

if 

 (Element [i] == itemToFind) 


            { 
               

return 

 i; 


            } 


        } 
        
      

return 

 - 

1 

 ; 


   } 


  }; 


// + ----------------------------------------------- ------------------- + 

O zaman onları şu şekilde bildirebilirsiniz:

CDynamicArray 

< 

int 

> 

  *Tickets; 


CDynamicArray 

< 

bool 

> 

 *FixedSLUsed; 


CDynamicArray 

< 

bool 

> 

 *PrevBarSLUsed; 

ve şöyle oluşturabilirsiniz:

                        Tickets = 

new 

 CDynamicArray< 

int 

>(); 


                        FixedSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 


                        PrevBarSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 

ve kodda onları normal bir sınıf gibi kullanırsınız:



int 

 ticket = 

PositionGetInteger 

 ( 

POSITION_TICKET 

 ); 


int 

 index; 


if 

 (!Tickets.Contains(ticket)) // If Ticket Object does NOT contains ticket then we go into the if 


{ 


        Tickets.Add(ticket); 


        FixedSLUsed.Add( 

false 

); 


        PrevBarSLUsed.Add( 

false 

); 


} 
      


index = Tickets.IndexOf(ticket);   
 

Tamam, MQL'in İngilizce sürümünü deneyelim.


Kod gönderiniz için teşekkürler. Bana zaman kazandırdı. MQL dizilerini kullanmayı denedim ve kafa karıştırıcıydılar. Daha sonra orada olması gereken temel yapıları bir kez daha yazmam gerektiği için çok üzüldüm AMA sonra diziler ve bunların dinamik olarak nasıl büyütüleceği / artırılacağı konusunda bana biraz araştırma süresi kazandıran kodunuzu buldum. HARİKA teşekkürler.

Umarım size geri verebilirim! Aşağıdaki kod tüm veri türleri için çalışır. Nesneler üzerinde de çalışacaktır ancak Contains (arama) yöntemi çalışmayabilir. Ben sadece (double, int, bool) tipleri üzerinde test ettim. String de size sorun çıkarabilir ve kodun genişletilmesi gerekebilir.


//+------------------------------------------------------------------+
//|CDynamicArray.mqh |
//|Tamsayı |
//| https://login.mql5.com/ru/users/Integer |
//+------------------------------------------------------------------+
#property copyright "Integer"
#property link "https://login.mql5.com/ru/users/Integer"
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
template <typename T>
class CDynamicArray
  {
private:
   int               m_ChunkSize;    // Yığın boyutu
   int               m_ReservedSize; // Dizinin gerçek boyutu
   int               m_Size;         // Dizideki aktif eleman sayısı
public:
   T                 Element[];      // Uygun dizi. Public bölümünde yer alır, 
                                     // böylece gerekirse doğrudan kullanabiliriz
   //+------------------------------------------------------------------+
   //| Kurucu|
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // Aktif eleman sayısı
      m_ChunkSize=ChunkSize;               // Yığın boyutu
      m_ReservedSize=ChunkSize;            // Dizinin gerçek boyutu
      ArrayResize(Element,m_ReservedSize); // Diziyi hazırlayın
     }
   //+------------------------------------------------------------------+
   //| Dizinin sonuna bir eleman ekleme fonksiyonu |
   //+------------------------------------------------------------------+
   void Add(T Value)
     {
      m_Size++; // Etkin öğe sayısını artırın
      if(m_Size>m_ReservedSize)
        { // İstenen sayı gerçek dizi boyutundan daha büyüktür
         m_ReservedSize+=m_ChunkSize; // Yeni dizi boyutunu hesapla
         ArrayResize(Element,m_ReservedSize); // Gerçek dizi boyutunu artırın
        }
      Element[m_Size-1]=Value; // Değeri ekleyin
     }
     
     void Set(int index, T Value)
     {
      m_Size++; // Etkin öğe sayısını artırın
      if(m_Size<index)
        { 
         return;
        }
      Element[index]=Value; // Değeri ekleyin
     }
   //+------------------------------------------------------------------+
   //| Dizideki aktif eleman sayısını elde eden fonksiyon|
   //+------------------------------------------------------------------+
   int Count()
     {
      return(m_Size);
     }
   
   T operator[](const int index) const { return Element[index]; }
   
   bool Contains(T itemToFind)
   {
      for(int i=0;i<Count();i++)
        {
            if(Element[i] == itemToFind)
            {
               return true;
            }
        }
        
      return false;
   }
   
   int IndexOf(T itemToFind)
   {
      for(int i=0;i<Count();i++)
        {
            if(Element[i] == itemToFind)
            {
               return i;
            }
        }
        
      return -1;
   }
  };
//+------------------------------------------------------------------+


Daha sonra ihtiyacınız olan tüm tipler için bu şekilde bildirimde bulunabilirsiniz:


//bunları sınıfımda şu şekilde bildirdim
   CDynamicArray<int> *Tickets;
   CDynamicArray<bool> *FixedSLUsed;
   CDynamicArray<bool> *PrevBarSLUsed;


// Sonra bunları sınıf metotlarımda şu şekilde bildirdim

   Tickets = new CDynamicArray<int>();
   FixedSLUsed = new CDynamicArray<bool>();
   PrevBarSLUsed = new CDynamicArray<bool>();

// ve bunları sınıf metotlarımda şu şekilde kullandım:
      int ticket = PositionGetInteger(POSITION_TICKET);
      int index;
      if(!Tickets.Contains(ticket))
      {
         Tickets.Add(ticket);
         FixedSLUsed.Add(false);
         PrevBarSLUsed.Add(false);
      }
      
      index = Tickets.IndexOf(ticket);  
//daha fazla kod kaldırıldı



umarım bu herkese yardımcı olur