2015年11月25日水曜日

[MT4プログラミング]小ネタ inputとexternの違いやsinputのお話し

MQLでの外部パラメータの指定として、externとinputという二つの指定方法があります。
externがもともとあり、あとからinputが追加されたようです。

この二つの違いはなんでしょう?私のプログラムでも古いものはextern、最近はinputを使用しています。

まぁあまり気にせず多分inputが正しいのだろうなと思い使っていましたが、ちょっとだけ気になったので調べてみました。
この辺りはMT4/5も変わらずと思い、日本語になっているMQL5.comからの引用してみます。

input
https://www.mql5.com/ja/docs/basis/variables/inputvariables

input ストレージクラスは、外部変数を定義しています。input 修飾子は、データ型の前に示されます。input 修飾子を持つ変数はMQL5 プログラム内で変更することはできず、読み取り専用でアクセスすることが出来ます。input 変数の値はプログラムのプロパティウィンドウから、ユーザによってのみ変更することが出来ます。

extern
https://www.mql5.com/ja/docs/basis/variables/externvariables

extern キーワードは変数名の宣言に静的ストレージクラスとグローバルライフタイムの識別子として使用されます。これらの変数はプログラムの先頭から存在し、メモリはプログラムの開始直後に割り当てられ初期化されます。

複数のソースファイルで構成されたプログラムを作成することは可能です。この場合、プリプロセッサに指示する #include ディレクティブが使用されます。同じ型と識別子を持つ extern と宣言された変数は、プロジェクト内の複数のソースファイルに存在することが出来ます。

うん。全然違う説明ですね。C言語的にはextern宣言は、グローバル宣言で、すべてのソースコードから共通で使用できる変数として宣言されます。プログラマ的には基本使っちゃダメ的な奴です。
MT4ではユーザ入力変数としてextern宣言を使用していたのを、言語仕様を整理する際、辻褄があってないので、inputを別に作ったという感じでしょうか?

input宣言の特徴としてはプログラム内からは値の変更ができない定数のように扱われることです。C#やJavaでいうところのfinal宣言みたいな感じですね。
値を変更しようとすると、コンパイルエラーとなります。

externはグローバル変数の扱いですので、どこからでも値の変更が可能です。

ユーザ入力変数としては、プログラムから値の書き換えが発生しないほうがわかりやすいと思いますので、やはりinputを使うのが正しい形なのかと思います。

ちなみに、sinputという宣言があり、なんぞ?と思いましたが、これはEAにて最適化対象外とするための宣言のようです。例えばマジックナンバーなどは最適化する必要がないため

sinput int MagicNumber = 123456789; // マジックナンバー

と宣言すると、


このように、EAテスターのエキスパート設定内からのパラメータ入力において、最適化対象のチェックボックスが無効化されます。

知りませんでした・・・^^;;;;
今作っているやつもちゃんと対応しないとですね。


ブログランキングにご協力よろしくお願いいたしますm(_ _ )m
にほんブログ村 為替ブログへ
にほんブログ村