改めて前回の内容をおさらいをしておくと、
ということをお伝えしました。
今回は配列について解説していこうと思います
※MQL5でEAを作るにあたっては、MT5・メタエディターがお使いのパソコンにインストールされている必要があります。
もし、まだMT5のダウンロードが完了していない方は、
こちらからデモ口座の開設とMT5のダウンロード・インストールを完了して頂ければと思います。
配列とは?
配列とは端的に言うと、
変数が複数連なったもの
になります。
変数は、データを入れておける箱のようなもの

という説明をしてきましたが、それでいくと配列というのはロッカーのようなものと考えればいいかと思います。

物も数や種類が増えてくると、箱がたくさん必要になってくるように、
プログラムでも、複雑な処理を担わせるようになると必然的に扱うデータの量・種類も増えてきます。
その際に、いちいち変数を用意して作らなくてもいいように配列という仕組みを使ってまとめて管理してしまえば、プログラム的に管理が楽、というわけです。
配列の作り方・使い方
先ほども説明した通り、
変数が複数連なったもの
変数の数が増えただけなのでそんなに難しく考える必要はありません。
普段行っている、変数をつくる記述に、配列を作る記述を足すだけです。
//3つのデータが入るint型の配列「Array」を作る
int Array[3];
↑これが配列の作り方の基本形です。
という記述の仕方をします。
データ型→ 変数名の後に[](四角カッコ=square bracket)をつけて、その中に必要なデータ格納数を記述する。
という手順を踏みます。
上記のサンプルコードでは3つのint型 変数が用意できたことを意味します。
配列が用意できたところで、それぞれの変数に値を格納してみましょう。
void OnStart()
{
//3つのデータが入るint型の配列「Array」を作る
int Array[3];
//配列の1番目の変数に値「5」を入れる
Array[0]=5;
//ログ出力
Print("配列の1番目の値=",Array[0]);
//配列の2番目の変数に値「10」を入れる
Array[1]=10;
//ログ出力
Print("配列の2番目の値=",Array[1]);
//配列の3番目の変数に値「15」を入れる
Array[2]=15;
//ログ出力
Print("配列の3番目の値=",Array[2]);
}
文章にすると
変数配列名の後ろの[]の中に、「配列の何番目の変数を使うのか」、数を指定する。
3つ変数が使える配列を用意した↓
このように記述します。
「あれ?なんで1番目の変数を表すのに、[0]ってなっているの?1つ少なくない?( ゚Д゚)」
と思われる方もいらっしゃるかもしれません。
配列の何番目の変数を扱うか、という[]の中の数字(インデックス、と呼んだりします)は0をスタート地点からの移動値(オフセット値、なんて呼んだりします)で指定する決まりになっています。
簡単に言えば、
1番目の変数→0から0個移動した→Array[0]
2番目の変数→0から1個移動した→Array[1]
3番目の変数→0から2個移動した→Array[2]
という感じです。
ひょっとしたら、混乱させてしまっているかもしれません(-_-;)
でもプログラミングにおいては大事な考え方になります。
まあ、あまり難しく考えず、使いたい順番の1つマイナスの数字を[]の中に入れる
と覚えておけばいいと思います。
ファイルの内容を実行してみましょう。↓

想定通りの結果が返ってきました。
範囲外アクセスエラー(array out of range)エラーについて
もしこのサンプルコードに、4番目の変数=[3]へのアクセスをするようなコードを足してみるとどうなるでしょう?
void OnStart()
{
//3つのデータが入るint型の配列「Array」を作る
int Array[3];
//配列の1番目の変数に値「5」を入れる
Array[0]=5;
//ログ出力
Print("配列の1番目の値=",Array[0]);
//配列の2番目の変数に値「10」を入れる
Array[1]=10;
//ログ出力
Print("配列の2番目の値=",Array[1]);
//配列の3番目の変数に値「15」を入れる
Array[2]=15;
//ログ出力
Print("配列の3番目の値=",Array[2]);
//配列の4番目の変数に値「20」を入れる
Array[3]=15;
//ログ出力
Print("配列の4番目の値=",Array[3]);
}
コンパイルしても、

特にコンパイルエラーは発生しませんでした。
ではプログラムファイルを実行してみましょう。

「array out of range ~~」
というエラーメッセージが出てしまいました。
これは範囲外アクセスエラーといって、
「配列宣言の際に、事前に決めた個数以上の変数を使おうとしてしまってますよー」
というエラーです。
もともと配列は3個しか使わないって言っていたのに、4個目を使おうとするのはルール違反
という訳です。
「あれ?でも、Array[3]って表記、コードの中に見た気がするけど・・・(‘ω’)」
確かに,
int Array[3];
という記述が、コードの最初の方にありますね。
でも、その上のコメントアウトしている説明を読んでみてください。
と書いてありますね?
この
int Array[3];
というのはあくまで
という宣言であって、配列内の特定の変数にアクセスする記述ではないんです。
ややこしいので、最初のうちは間違えがちですが、注意しておきましょう。
範囲外アクセスエラーはプログラムが作動停止してしまう重大なエラーになってしまいます。
配列宣言時にまとめて値を入れる
配列を作った(=宣言した)際に、まとめて最初の値(初期値)を代入することもできます。
void OnStart()
{
//3つのデータが入るint型の配列「Array」を作る
//配列の1番目の変数に値「5」を入れる
//配列の2番目の変数に値「10」を入れる
//配列の3番目の変数に値「15」を入れる
int Array[3]={5,10,15};
//ログ出力
Print("配列の1番目の値=",Array[0]);
Print("配列の2番目の値=",Array[1]);
Print("配列の3番目の値=",Array[2]);
}
↑のように、
配列宣言時、{}(波カッコ curly brcket)の中に左から、順番に1番目の変数に入れる値を入れ、コンマで区切って次は2番目の変数に値を入れ、コンマで区切って次は3番目の変数に値を入れる・・・
という手順の記述をすることによって、まとめて配列内の個々の変数に値を渡すことができます。
プログラムファイルを実行してみましょう。↓

最初に、1個づつ値を代入していった時と同じ結果が得られました。
コード内容もシンプルになりましたね(*^^)v
今回はいったんここまでにしますが、次回も配列の話が続きます。
まとめ
今回は配列について解説しました。
今回の記事では以下のことを学びました
- 最初に宣言した数以上の配列データにアクセスしようとすると、範囲外アクセスエラーを引き起こすので注意する。
最後までお読みいただきありがとうございました<m(__)m>
コメント