MQL5超入門(6)/const 修飾子
indicator からObjectCreate ができない問題は…1つのチャートで複数のEAを動かせる仕様になりそうな話が本家フォーラムで出てきました。いつ実現するのかは分かりませんが、妥当な解決策なのではと思っています..。
それよりも・・・ここ何日か、本家でのHelpファイルの更新が止まっているので、もしかして8月中のベータテスト開始も無理なの???
なんて悪い予感を感じつつ…MQL5超入門の第六回です。(ーー;
今日は、const 修飾子を紹介します。
const 修飾子は、特定の関数の中で、「この変数は値を変更しません」宣言をする時に使います。
具体的には、
int MyFunction (const int &a, int &b) //引数リストの中で、値を変えたくない変数の先頭に const をつける { int c; b = b + 1; // const 宣言した a の値は変更できないが、そうではない b は値を変えられる c = a + b; return(c) }
のように書きます。
このプログラムで、const と書いても書かなくても、関数の計算結果はまったく変わりません。
それでは意味ないじゃん!と思われるかもしれませんが、さにあらず。
const の役割は、一般には 2 種類あって
(1) プログラムミスを見つけやすくする。
(2) コンパイラがプログラムを最適化しやすくする。
があります。
MQL5 で、(2) の最適化がどこまで効くのかは分かりませんが、(1) は有効だと想像しています。
うっかりミスをして以下のようなコードを書くと
int MyFunction (const int &a, int &b) // a の先頭に const をつける { int c; a = a + 1; // 変更しない宣言をしている a を変えようとしている !! c = a + b; return(c) }
コンパイル時にエラーがでる・・・はずです。
MQL5 の標準関数の中には、const 宣言しているモノがいくつかあって、
例えば、indicator にとっての start() 関数に替わるOnCalculate() でも使われています。
int OnCalculate(const int rates_total, //価格データ配列の総数 const int prev_calculated, //前回のOnCalculate呼び出し時に計算したデータ数 const int begin, //意味のあるデータの開始位置(現在、意味不明です..) const double &price[] //価格データ配列 );
こんな風に宣言されているOnCalculate() の中で、
rates_total = rates_total - 1; prev_calculated = 0; price[0] = price[1];
などと書くとエラーになるのでご注意ください。