MQL4で構造体をコピーするときの注意点

問題点

 MQL4で、"="を使って構造体をコピーしようとすると、次のようなエラーが出る場合があります。

「structure have objects and cannot be copied」

このエラーは、例えば次のようなコードで発生します。

struct sample
{
   string s_value;
   int    i_value;
   double d_value;
};

int OnInit()
{  
   sample a;
   a.s_value = "hoge";
   a.i_value = 10;
   a.d_value = 1.23;

   sample b = a;

   return(INIT_SUCCEEDED);
}

原因

 このエラーが発生する原因は、構造体の中でstring型を使用しているためです。string型が使われていない構造体ではこのエラーは発生しません。

struct sample
{
   int    i_value;
   double d_value;
};

int OnInit()
{  
   sample a;
   a.i_value = 10;
   a.d_value = 1.23;

   sample b = a;

   return(INIT_SUCCEEDED);
}

 上のコードは構造体にstring型を使っていないので、構造体をコピーしてもエラーになりません。

解決方法

 しかし構造体に文字列を含めたいときもあると思います。このエラーを出さずに文字列を含んだ構造体をコピーするには、string型の代わりにchar型の配列を使用します。構造体に文字列を代入するときは、StringToCharArray関数を使用します。逆に構造体から値を取得する際には、CharArrayToString関数を使用します。

struct sample
{
   char   s_value[100];
   int    i_value;
   double d_value;
};

int OnInit()
{  
   sample a;
   StringToCharArray("hoge", a.s_value, 0, WHOLE_ARRAY);
   a.i_value = 10;
   a.d_value = 1.23;

   sample b = a;
   Print(CharArrayToString(b.s_value));

   return(INIT_SUCCEEDED);
}

 ただしこの方法にも問題があり、配列の長さを構造体の宣言の段階で決めていないとエラーになります。予め文字数の上限が決まっていないと使えない方法です。

arrow_upward