構造体
構造体(
struct)は、幾つかの異なる型(
voidを除く)を
まとめて一つのデータ型として扱う事が出来ます。
書式:
struct 構造体名 {
データ型 メンバ名;
データ型 メンバ名;
・・・
};
構造体名は識別子(変数または関数名)として使う事は出来ません。
以下のメンバ調整の内容は、dllを考慮してプログラミングする人向けです。
MQL4だけで完結する独立したプログラミングをする場合は気にしなくても良い内容です。
尚、MQL4に#pragmaはありません。
MQL4の構造体は、メンバの型に関係無くそのまま連続します。
(C++で#pragma pack(1)を使い、1byteでアライメントしている状態と同じです。)
もし構造体でアライメント調整を行いたい場合は、原始的な方法ですが調整用メンバを追加する必要があります。
また、
double等の大きなデータ型を宣言する場合は、メンバの最初の方で行うのがベターです。
サンプルソース:
struct tmp_st {
double st_double;
uchar st_char;
char st_alignment1;
short st_alignment2;
int st_int;
};
単純な構造体
文字列を含まないまたは
動的配列を含まない構造体を"単純な構造体"と呼びます
(逆に、
文字列を含む、または
動的配列を含む構造体を"複雑な構造体"と呼びます)。
単純な構造体は異なる構造体であったとしても変数を自由にコピーする事が出来ます。
サンプルソース:
struct st_1 {
char st1_char;
};
struct st_2 {
short st2_short;
};
struct st_3 {
int st3_int1;
int st3_int2;
};
struct st_4 {
string st4_str;
};
int OnInit(){
st_1 s1;
st_2 s2;
st_3 s3;
st_4 s4;
s1.st1_char= 2;
s2=s1;
Print( s1.st1_char , " " , s2.st2_short);
s3=s2;
Print( s3.st3_int1, " " , s3.st3_int2);
s4.st4_str="文字定数";
s3=s4;
return 0;
}
構造体メンバへのアクセス
構造体の型は、この型の変数を宣言する為の新しいデータ型です。
構造体の型は、プロジェクトの範囲内で一度だけ宣言する事が出来ます。
構造体のメンバへのアクセスはピリオド(.)を使用します。
サンプルソース:
struct st_marketinfo_type{
double tmp_high;
double tmp_low;
double tmp_open;
double tmp_close;
};
st_marketinfo_type st_data = {0,0,0,0};
st_data.tmp_high = High[0];
st_data.tmp_low = Low[0];
st_data.tmp_open = Open[0];
st_data.tmp_close = Close[0];
Print( "高値:" + DoubleToStr( st_data.tmp_high , Digits) );