改めて前回の内容をおさらいをしておくと、
- 最初に宣言した数以上の配列にアクセスしようとすると、範囲外アクセスエラーを引き起こすので注意する。
ということをお伝えしました。
今回は静的配列と動的配列 について解説していこうと思います。
今回の記事を読んで勉強することによって、前回の配列に関する基礎的な部分の理解が深まり、なおかつ配列をEA開発においてどのように使っていけばよいのか、という具体的なイメージが抱けるようになると思います。
※MQL5で自動売買プログラム作るにあたっては、メタトレーダー5・メタエディター5がお使いのパソコンにインストールされている必要があります。
もし、まだメタトレーダー5のダウンロードが完了していない方は、
こちらからデモ口座の開設とメタトレーダー5のダウンロード・インストールを完了して頂ければと思います。
静的配列とは?
静的配列は
のことです。
前回の記事で解説した
int Array[3]
というのは、
[3]
と書くことによって、「3つのデータを使う」という風に最初に決定しています。
静的配列の場合、
いったん「3つのデータを使う」という宣言を最初にしたら、
後からそれを変えることはできません。
でも、作るプログラムによっては、それだと都合が悪い場合が出てきます。
そこで登場するのが動的配列です。
※前回書いた事でもありますが、この「3つのデータを使う」と定義した配列にアクセスすとき、配列のインデックス(通し番号)は0から始まります。従って、3番目の配列に格納されているデータにアクセスしたい時は
Array[2]
と記述します。
Array[3]と書いてしまうと範囲外アクセスエラーが発生してしまいますので注意してください。
動的配列とは?
最初に配列を作るとき(=宣言する時)に「いくつのデータを使うか」を決定しない配列」
です。
このように
int dynamicArray[];
[]のなかに、扱うデータ数を指定せず、ブランクにします。
動的配列は価格データや、インジケータに関する値データを扱う際によく使われるのですが、上記サンプルコードのdynamicArray[]のように、サイズを明示せず、初期値の要素も設定しない場合(つまり配列を空で宣言した場合)、そのサイズは0となります。
そのため、その状態の動的配列に値を代入するには、ArrayResize関数という関数で配列のサイズを拡張し、必要な要素数を確保する必要があります。
※動的配列が扱う配列サイズはこのArrayResize関数で、いつでも変更することができます。
※関数とはより簡単に、プログラムを動かすための仕組みです。関数については講座第25回で取り上げますが、先に詳しく知りたいという方は↓の記事をご覧ください。(特に先に読んでも差し支えないと思います)
//動的配列「dynamicArray」を作る
int dynamicArray[];
//配列dynamicArrayの扱える配列サイズを3に変更する。
ArrayResize(dynamicArray,3);
//配列dynamicArrayの1番目の変数に5を代入する。
dynamicArray[0]=5;
↑のような形で、動的配列だった配列dynamicArrayのサイズを途中で、ArrayResize関数を使って3に変更しました。
関数全般の話をまだしていないので、ArrayResize関数の()の中身もまだわからなくても大丈夫なのですが、一応説明しておくと
・()の中の最初にサイズ変更したい配列名を記述し、コンマで区切った次に変更サイズを指定する。
↑のような記述ルールの関数になっています。
おまけー配列を宣言する際にサイズを規定せずに初期値を設定するとどうなるか?ー
以下のサンプルコードのように、配列を宣言する際にサイズを規定せずに初期値を設定することは可能です。
int myArray[] = {1, 2, 3};
ここでは、myArray
という配列が3つの要素(1, 2, 3)を持つように初期化され、そのサイズは自動的に3になります。
つまり上記のような記述をした場合、配列は、3つの要素を持つ静的配列として機能します。
従って、この方法で配列を宣言すると、その後の配列のサイズは固定され、ArrayResize関数を使ってのサイズ変更はできません。
もし実行時に配列のサイズを変更したい場合は、明示的に動的配列を使用するか、別のデータ構造(例えばリストやベクター→別の機会に解説する予定です)を使用する必要があります。
※なお、「静的」「動的」という言葉は、今後プログラミング学習を進めていく中で、頻繁に出くわす言葉になります。
基本的に
静的→「事前に決められた」または「固定された」
動的→「進行中に調整可能な」または「実行時に変化する」
と読み替えて頂ければ問題ないかと思います。「静的」「動的」という言葉について別途解説した記事もありますので、宜しければお読みください↓
最後までお読みいただきありがとうございました<m(__)m>
コメント