記事"MQL5 プログラミング基礎:配列"についてのディスカッション - ページ 2

 
 
関数から配列を返すにはどうすればいいのでしょうか? 私は回避策を見つけましたが、明らかに "正面から "やる方法があるはずです)。
 
thejobber:
関数から配列を返すには? 今のところ回避策は見つかりましたが、明らかに「正面から」やる方法があるはずです)。

真正面からやる方法はありません。配列へのポインタ以外には。例えば

CArrayDouble *Function(void);

真正面からではなく、ごく標準的な方法です:

void Function(double &_arr_out[]);
一般的に、返される配列はパラメータ参照である。
 

ああ、ありがとう。すぐに

を返そうとしたんだ。)

の代わりに

returnGetPointer(x)

を返そうとしたんだ。)

 
MetaQuotes Software Corp.:

新しい記事「MQL5プログラミングの基礎」:配列を 公開しました:

著者ドミトリー・フェドセーエフ

1 質問

#define  SIZE_X 3;

(...)

int ArrayName[SIZE_X];

コンパイラはこのような構造を禁止しています。なぜですか?

 
長時間のレビューに感謝する
 
#import "dll.dll"
  double qwerty(double &q[]);
#インポート

DLLを作っていて、配列ポインタを渡したいんだ。

でも、その方法がわからない。

何かが間違っている。


C++のアナログが必要だ。


double qwerty(double *q);

double *q;

q= new ダブル[100];

qwerty(q);


MQL5でそれを行うには...

 
mqlでは、配列が何であれ、それはそれであり、それを使って何かをすることはできない。何の問題もないはずだ。エラーはあなたのDLLのどこかにある。多分、DLLの中で配列の サイズを渡すべきだろう。
 

コードを書いてくれてありがとう。MQL5の配列オブジェクト(double,intなど)を使おうとしたのですが、挫折してしまいました。あなたの投稿にたどり着き、配列のサイズを変更するコードを見つけました。どんなデータ型にも対応できるようにコードを修正しました。ただ、オブジェクトに対してContains(Searchメソッド)メソッドを使おうとしないでください。オブジェクトは参照かもしれないので、うまくいかないかもしれません。私は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 [];       

// 適切な配列。
これは public セクションにあります、 
                                     

// 必要であれば、それを直接使えるようにする。 
   

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

|
コンストラクタ 
   

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

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(検索)メソッドは動作しないかもしれません。私がテストしたのはdouble, int, bool型だけです。文字列でも問題が発生する可能性があり、コードを拡張する必要があるかもしれません。


//+------------------------------------------------------------------+
//|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[];      // 適切な配列。これは public セクションにあります、 
                                     // 必要であれば、それを直接使えるようにする。
   //+------------------------------------------------------------------+
   //| コンストラクタ|
   //+------------------------------------------------------------------+
   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);  
//より多くのコードが削除された



どなたかのお役に立てれば幸いです。