기고글 토론 "MQL5 프로그래밍 기본: 배열" - 페이지 2

 
매우 유용한 잘 설명된 기사입니다. 감사합니다, 드미트리 페도세프.
 
함수에서 배열을 반환하는 방법? 해결 방법을 찾았지만 분명히 "정면으로" 수행하는 방법이있을 것입니다.)
 
thejobber:
함수에서 배열을 반환하는 방법? 지금까지 해결 방법을 찾았지만 분명히 "정면으로"할 수있는 방법이있을 것입니다)).

정면으로 할 수 있는 방법은 없습니다... 배열에 대한 포인터를 사용하는 것 외에는 방법이 없습니다. 예를 들어

CArrayDouble *Function(void);

이 섹션에서는 정면으로 접근하지는 않지만 이와 같은 표준 접근 방식을 사용합니다:

void Function(double &_arr_out[]);
일반적으로 반환된 배열은 매개변수 참조입니다...
 

네, 감사합니다. 저는 바로

반환 *x; 습관적으로, C++에서처럼 )))

대신

반환 GetPointer(x)

를 반환하는 것을 알아냈습니다))

 
MetaQuotes Software Corp.:

새 문서 MQL5 프로그래밍 기초: 배열이 게시되었습니다:

작성자: Dmitry Fedoseev

1 질문:

#define  SIZE_X 3;

(...)

int ArrayName[SIZE_X];

컴파일러는 이러한 구성을 금지합니다. 왜 그럴까요?

 
이 연장 리뷰에 감사드립니다.
 
"dll.dll" #임포트
  더블 쿼티(double &q[]);
#import

dll을 만들고 있는데 배열 포인터를 전달하고 싶습니다.

하지만 어떻게 해야 할지 모르겠어요.

뭔가 잘못됐어요.


C++의 아날로그가 필요합니다.


더블 쿼티(더블 *q);

double *q;

q = new double [100];

쿼티(Q);


MQL5에서 하는 방법...

 
mql에서는 배열이 무엇이든, 그것이 바로 그 배열이며, 그것으로 아무것도 할 수 없습니다. 문제가 없어야 합니다. 오류는 dll 어딘가에 있습니다. dll에 배열 크기를 전달해야 할 수도 있습니다.
 

코드를 작성하는 데 시간을 절약해 주셔서 감사합니다. MQL5 배열 객체 (double, int 등)를 사용하려고했는데 좌절했습니다. 귀하의 게시물을 방문하여 배열의 크기를 조정하는 코드를 발견했습니다. 모든 데이터 유형에 맞게 코드를 수정했습니다. 다만 객체가 참조일 수 있으므로 객체에 대해 Contains (검색 메서드) 메서드를 사용하지 마십시오. 저는 MQL5 내에서 C#을 다시 만들려고 노력하고 있으므로 약어가 비슷합니다 :)


신의 축복 !!!



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


// 
CDynamicArray.mqh | 


// | 
정수 | 


// | 
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;     

// 청크 크기 
   

int 

                m_ReservedSize; 

// 배열의 실제 크기 
   

int 

                m_Size;         

// 배열의 활성 요소 수 


public 

 : 


   T Element [];       

// 적절한 배열입니다. 
공개 섹션에 있습니다, 
                                     

//를 사용하여 필요한 경우 직접 사용할 수 있습니다. 
   

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

| 
생성자 | 
   

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

void 

 CDynamicArray ( 

int 

 ChunkSize = 

1024 

 ) 


     { 


      m_Size = 

0 

 ;                             

// 활성 요소 수 


       m_ChunkSize = ChunkSize;               

// 청크 크기 


       m_ReservedSize = ChunkSize;             

// 배열의 실제 크기 
      

ArrayResize 

 (Element, m_ReservedSize); 

// 배열 준비 


      } 
   

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

// | 
배열 끝에 요소를 추가하는 함수 | 
   

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

void 

 Add (T Value) 


     { 


      m_Size ++; 

// 활성 요소 수 늘리기 
      

if 

 (m_Size> m_ReservedSize) 


        { 

// 필요한 숫자는 실제 배열 크기보다 큽니다. 


          m_ReservedSize + = m_ChunkSize; 

// 새 배열 크기 계산 
         

ArrayResize 

 (Element, m_ReservedSize); 

// 실제 배열 크기 늘리기 


         } 


      Element [m_Size- 

1 

 ] = Value; 

// 값 추가 


      } 
     
     

void 

 Set ( 

int 

 index, T Value) 


     { 


      m_Size ++; 

// 활성 요소 수 늘리기 
      

if 

 (m_Size <index) 


        { 
         

return 

 ; 


        } 


      Element [index] = Value; 

// 값 추가 


      } 
   

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

// 
배열의 활성 요소 수를 가져오는 함수 | 
   

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

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 

 ; 


   } 


  }; 


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

그런 다음 다음과 같이 선언 할 수 있습니다:

CDynamicArray 

< 

int 

> 

  *Tickets; 


CDynamicArray 

< 

bool 

> 

 *FixedSLUsed; 


CDynamicArray 

< 

bool 

> 

 *PrevBarSLUsed; 

와 같이 선언하고

                        Tickets = 

new 

 CDynamicArray< 

int 

>(); 


                        FixedSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 


                        PrevBarSLUsed = 

new 

 CDynamicArray< 

bool 

>(); 

그리고 코드에서 일반 클래스처럼 사용하면 됩니다:



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);   
 

좋아요, 영어 버전의 MQL을 사용해 보겠습니다.


코드를 게시해 주셔서 감사합니다. 시간을 절약할 수 있었어요. MQL 배열을 사용하려고 했는데 혼란스러웠습니다. 그런 다음 다시 한 번 기본 구조를 작성해야한다는 사실에 매우 우울했지만 배열에 대한 연구 시간과 동적으로 성장 \ 증가시키는 방법을 절약 할 수있는 코드를 발견했습니다. 정말 고마워요.

저도 보답할 수 있으면 좋겠어요! 아래 코드는 모든 데이터 유형에서 작동합니다. 객체에서도 작동하지만 Contains(검색) 메서드는 작동하지 않을 수 있습니다. 더블, 인트, 부울 유형에서만 테스트했습니다. 문자열에서도 문제가 발생할 수 있으며 코드를 확장해야 할 수도 있습니다.


//+------------------------------------------------------------------+
//|CDynamicArray.mqh |
//|정수 |
//| 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;    // 청크 크기
   int               m_ReservedSize; // 배열의 실제 크기
   int               m_Size;         // 배열의 활성 요소 수
public:
   T                 Element[];      // 적절한 배열입니다. 공개 섹션에 있습니다, 
                                     //를 사용하여 필요한 경우 직접 사용할 수 있습니다.
   //+------------------------------------------------------------------+
   //| 생성자|
   //+------------------------------------------------------------------+
   void CDynamicArray(int ChunkSize=1024)
     {
      m_Size=0;                            // 활성 요소 수
      m_ChunkSize=ChunkSize;               // 청크 크기
      m_ReservedSize=ChunkSize;            // 배열의 실제 크기
      ArrayResize(Element,m_ReservedSize); // 배열 준비
     }
   //+------------------------------------------------------------------+
   //| 배열 끝에 요소를 추가하는 함수 ||
   //+------------------------------------------------------------------+
   void Add(T Value)
     {
      m_Size++; // 활성 요소 수 늘리기
      if(m_Size>m_ReservedSize)
        { // 필요한 숫자가 실제 배열 크기보다 큽니다.
         m_ReservedSize+=m_ChunkSize; // 새 배열 크기 계산
         ArrayResize(Element,m_ReservedSize); // 실제 배열 크기 늘리기
        }
      Element[m_Size-1]=Value; // 값 추가
     }
     
     void Set(int index, T Value)
     {
      m_Size++; // 활성 요소 수 늘리기
      if(m_Size<index)
        { 
         return;
        }
      Element[index]=Value; // 값 추가
     }
   //+------------------------------------------------------------------+
   //| 배열의 활성 요소 수를 가져오는 함수|
   //+------------------------------------------------------------------+
   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;
   }
  };
//+------------------------------------------------------------------+


그런 다음 필요한 모든 유형에 대해 다음과 같이 선언 할 수 있습니다:


//내 클래스에서 다음과 같이 선언했습니다.
   CDynamicArray<int> *Tickets;
   CDynamicArray<bool> *FixedSLUsed;
   CDynamicArray<bool> *PrevBarSLUsed;


// 그런 다음 클래스 메서드에 다음과 같이 선언했습니다.

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

// 그리고 제 클래스 메서드에 다음과 같이 사용했습니다:
      int ticket = PositionGetInteger(POSITION_TICKET);
      int index;
      if(!Tickets.Contains(ticket))
      {
         Tickets.Add(ticket);
         FixedSLUsed.Add(false);
         PrevBarSLUsed.Add(false);
      }
      
      index = Tickets.IndexOf(ticket);  
//더 많은 코드가 제거되었습니다.



이것이 누군가에게 도움이되기를 바랍니다.