改めて前回の内容をおさらいをしておくと、
- 多次元配列 は 配列が複数連なったものである。
- 多次元配列はデータを表形式に整理・利用できる。
- 多次元配列は4次元まで作ることができる。
- 多次元配列において、動的配列にできるのは最初の次元の配列だけである。
ということをお伝えしました。
今回はEnum列挙型というものについて解説していきたいと思います<m(__)m>
Enum列挙型を使いこなせるようになると、EA開発におけるコード記述を整理するのに大変役立ちます。
たとえば、為替市場におけるさまざまな状態や注文タイプを扱う際、Enum列挙型を使用することで、それぞれの状態やタイプに具体的な名前を付けることができます。
これにより、数値や不透明なコードを解釈する代わりに、直感的に理解できる名前を使用することができます。
今の時点ではピンとこないかもしれませんが、実際にEAを開発する段階になると、それが実感できるようになるかと思います。EA開発の上でまた一つ便利な武器が手に入る!といったイメージを抱きながら今回も読んでいただけると幸いです。
分かりやすい解説を心掛けましたので、今回も是非楽しんで学習して頂ければと思います。
※MQL5で自動売買プログラム作るにあたっては、MT5・メタエディターがお使いのパソコンにインストールされている必要があります。
もし、まだMT5のダウンロードが完了していない方は、
こちらからデモ口座の開設とMT5のダウンロード・インストールを完了して頂ければと思います。
Enum列挙型とは?
Enum列挙型というのは、今までの講座記事で取り上げてきたデータ型の一つです。
データ型については大丈夫でしょうか?
データ型→ 変数に入れるデータの種類を決めるためのラベルのようなもの
でしたね。
整数型(int) とか 実数型(double) とか 文字列型(string)とか、そういうやつです。
忘れてしまった人は↓の記事をご覧ください。
Enum列挙型の特徴は、整数型 の 定数をまとめて、リスト化できるところにあります。
※定数 のことは覚えていますでしょうか?
定数→定まった数→決まっている、変わらない数
でしたね。詳しくは↓をご覧ください。
でも、整数型の定数をまとめてリスト化する、と言われてもピンとこないですよね?
実際にEnum列挙型を作ってみましょう。
Enum列挙型の作り方
サンプルとして、1週間を表すEnum列挙型を作っていきたいと思います。↓のような感じになります。
//「DayOfWeek」という名前のenum列挙型を作る。
enum DayOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
サンプルコードの中身を順にみていきましょう。
まず enum
というキーワードを最初に記述します。この記述によって、
という意味になります。
続いて、データ型の名前を決めます。これは変数名と同じように自分で決めます。
今回はデータ型の名前は「DayOfWeek」としました。
データ型の名前を記述したら、その後ろに{}を書いて、{}内にリスト化する値をコンマで区切って記述していきます。
}の後ろには普通の記述文と同様に、いったん記述の終了を表す ;(セミコロン)をつけます。
ご覧の通り1週間の各曜日の英単語が、コンマ区切りで{}内に記述されていますね。
・・・「Enum列挙型は整数型 の 定数をまとめてリスト化したものって言っていなかったっけ?
SundayとかMondayって文字じゃん!( `ー´)ノ」
と思われた方は鋭いです。
鋭いですが、そのことについてはもうしばらくお待ちください。
実際に作ったEnum列挙型をプログラムの中で使ってみると、わかると思います。
Enum列挙型の使い方
では、「DayOfWeek」という名前のEnum列挙型をOnStart関数の中で使ってみましょう。
//「DayOfWeek」という名前のenum列挙型を作る。
enum DayOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
void OnStart()
{
//enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
DayOfWeek day;
//変数「day」に、値「Tuesday」を代入
day=Tuesday;
//ログ出力
Print(Tuesday);
}
先ほど、「DayOfWeek」というデータ型をまず記述し、その後ろに、「day」という変数名(=インスタンス)をつけました。これで「day」には「DayOfWeek」でリスト化したSundayとかMonday・・・といった値が格納できるようになったわけです。
※今回解説しているEnum列挙型や、今後出てくる構造体、クラスなどのように、自分で作れるデータ型を実際に利用する時に、宣言する変数のようなもの(上のサンプルコードで言えば、「day」に該当するもの)をインスタンスと呼びます(インスタンスについては第54回「インスタンスについて」 で詳しく解説予定です)↓
インスタンス→Enum列挙型やクラスや構造体を実際に使う時に宣言する、変数名のようなもの
まずはこれだけ覚えておいてください。(構造体とクラスについては、講座第22回と第48回でそれぞれ解説しますので、今は覚えなくても大丈夫です)
試しに値「Tuesday」を代入して、Print関数でログ出力してみましょう。↓
↑メッセージには「Tuesday」ではなくて、「2」という数字が出てきました。
???どういうことでしょうか?
ここで
というEnum列挙型の定義に立ち戻るわけです。こういうことです↓
enum DayOfWeek
{
Sunday,//定数0として処理される
Monday,//定数1として処理される
Tuesday,//定数2として処理される
Wednesday,//定数3として処理される
Thursday,//定数4として処理される
Friday,//定数5として処理される
Saturday//定数6として処理される
};
Sunday、Monday・・・といった情報はあくまで我々人間が表面上視認しているものであり、実際にプログラムとしては、列挙している順に0,1,2・・・という定数で認識・処理されるわけです。
プログラムの最後の記述を少しだけ変えてみます。↓
void OnStart()
{
//enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
DayOfWeek day;
//変数「day」に、値「Tuesday」を代入
day=Tuesday;
//ログ出力
Print(EnumToString(day));
}
Print関数の中にEnumToString関数という関数が入っています。
少し難しい記述になっておりますが、細かい意味は今は分からなくても大丈夫です。
※詳しく知りたい方は↓の記事をご参照ください。
Enum列挙型のデータを文字列データに変換している、と思ってください。
実行してみます
定数データが文字列データに変換されて「Tuesday」がログ出力されました。
Sunday=0,Monday=1・・・ということであれば、こういう記述にしても↓・・・
void OnStart()
{
//enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
DayOfWeek day;
//変数「day」に、値「2」を代入
day=2;
//ログ出力
Print(EnumToString(day));
}
インスタンス「day」に代入する値を「Tuesday」から「2」に変更しました。
実行してみます。
出力結果は値「Tuesday」を代入していた時と同じになりました。
Enum列挙型として作った「DayOfWeek」にて、「Tuesday」=「定数2」と定めているので、必然的に上記のような結果になります。
ちなみに、「DayOfWeek」が定数リストとして定義しているのは、「Sunday=0」 から「Saturday=6」までなので、
↓のように
void OnStart()
{
//enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
DayOfWeek day;
//変数「day」に、値「7」を代入
day=7;
//ログ出力
Print(EnumToString(day));
}
インスタンス「day」に、値「7」を代入し、これをコンパイルすると・・・
コンパイルエラーになってしまいました。
エラーの内容は
「7はEnum列挙型「DayOfWeek」のデータに変換できません」
というものです。7は定数リスト化されていない値なので、変換できないという訳です。
また、Enum列挙型の定数リストは、記述した順に0,1,2,3・・・でなければ駄目!という訳でもありません。
Enum列挙型を作るときに、自分自身で設定することもできます。↓
//「DayOfWeek」という名前のenum列挙型を作る。
enum DayOfWeek
{
Sunday=1,//Sundayを定数1として設定する
Monday=4,//Mondayを定数4として設定する
Tuesday=3,//Tuesdayを定数3として設定する
Wednesday=6,//Wednesdayを定数6として設定する
Thursday=2,//Thursdayを定数2として設定する
Friday=5,//Fridayを定数5として設定する
Saturday=0//Saturdayを定数0として設定する
};
void OnStart()
{
//enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
DayOfWeek day;
//インスタンス「day」に、値「2」を代入
day=2;
//ログ出力
Print(EnumToString(day));
}
0-6の値をバラバラに割り振りました。このプログラムを実行すると・・・
定数「2」が割り振られている「Thursday」がログ出力されました。
以上がEnum列挙型の概要になります。
いかがだったでしょうか?少し混乱させてしまったかもしれません。
でも今回やった事というのは、そこまで大したことではなく、
元々用意されていた、int や double、 string といったデータ型とは別に、「DayOfWeek」という名前のオリジナルのデータ型を作った、というだけなんです。
今までの講座記事で取り上げてきたデータ型と違い、Enum列挙型はある程度自分でカスタマイズできるデータ型である、ということを押さえていただけると幸いです。
「カスタマイズできるデータ型」という考え方は、この後取り扱う予定の 構造体やクラスにも適用できる考え方だからです。
・・・でも、無理はしないでくださいね。 ^^) _旦~~
わからなくなったり、忘れてしまった事項は後から何度でも読み返し、復習すればいいだけです。
コメント