MetaTrader 4 Build 529 ベータ版リリース、新コンパイラー搭載 - ページ 17

 
Barbarian:

以前はうまくいっていたのでしょうか?i変数をどこに宣言しているのかがわかりません。


グローバル変数では、iを一度初期化して、それをすべてのループで使う方が便利だし、簡単だ ...
 
ALXIMIKS:

すでに起動して動作している インジケーターのパラメーターを ダブルクリックで 変更 すると、そのようになるということなのでしょうか。

インジケータは静的変数を更新 しないので、再描画されないのでは?


静的変数は、プログラムを再初期化してもその値を保持します。プログラムをチャートから削除して再参加したときのみ、値が保存されるわけではありません。再初期化時にスタティック変数をリセットするために、私はこの構文を使っています。

bool g_init;

void OnInit()
{
   g_init = true;
}

void MyFunction()
{
   static int myStatic;
   if (g_init)
   {
      myStatic = 0;
      g_init = false;
   }
}
 
VOLDEMAR:
このような仕組みになっています ...

このような仕組みにはなっていません。


2つ目のケースは,関数内で宣言された配列のスコープが関数である場合です.

コード内

for(i=Coment-1; i>=1; i--){info[i]=info[i-1]; cv  [i]=cv  [i-1];}info[0]=txt;cv[0]=et;


配列の すべての項目を、値 txt と et で初期化していることは確かですか?おそらく、最後の2つの課題はループの前に来るべきで、ループは別の方法で構築されるべきです。それとも、そんな発想なのでしょうか。

 
Scriptong:


静的変数は、プログラムを再初期化してもその値を保持します。プログラムをチャートから取り外し、再度装着したときのみ、値が保持されるわけではありません。再初期化時にスタティック変数をリセットするために、私は以下のような構成にしています。


509では何も問題なかったのに、ここでは......。
 
alexvd:


2つ目のケースは、関数内で宣言された配列のスコープが関数である場合です。

コードでは


配列の全要素をtxtとetで初期化しているのは間違いないでしょうか?おそらく、最後の2つの課題は、ループの前に来るはずです。それとも思いつき?


まず、ループ内でテキストを1レベル移動させ、その後、新しいテキストにNULL値を代入する...。

これらの配列は、上で紹介した関数の中でしか使われませんが ...

509以前のビルドでは、どちらの場合もすべてうまくいきました.今、最初のケースのみ ...

 
ALXIMIKS:

ライブラリーを調べて全部書き換えてどうするんだ? 無茶苦茶だ、509では全部うまくいっていたのに、今は・・・・・・。


コード内で使用するすべての変数をコードの先頭で初期化した方が良いだけなのですが...。

これは、作業を簡素化し、プログラムの開始時に変数を 参照して正しくリセット し、さらに使用することが可能になります ...

 
ALXIMIKS:

すでに起動して動作している インジケーターのパラメーターを ダブルクリックで 変更 すると、そのようになるということなのでしょうか。

インジケータはスタティック変数を更新 しないので、再描画されないのでは?

私の記憶では、ずっとそうでした(509ビルドでは確かにそうでした)。それはバグです。

VOLDEMAR

XPとW 7の異なるコンピュータで奇妙なことに気づきました。

関数内部で配列を初期化する際、配列全体に値が入るわけではなく、0値だけが入る ...

すべての関数を越えてグローバルレベルで配列を初期化する場合、配列が完全に埋められるはずです ...

何度も言われていることですが、配列や 変数は明示的に初期化 し、「天の恵み」を待たないでください。

地方創生宣言の場合は、運が良ければゴミが出ないだけです。しかし、私はそれを当てにしない。

 
新しいコンパイラと新しい実行環境は、コードの品質を何倍にも厳しく制御することに注意してください。 多くのMQL4コードは、サードパーティの開発者が手を下して書いたものですが、今後はこれらの欠陥がすぐに目につくようになります。
 

間違っていたら訂正してください。

あるインジケータでライブラリ関数を使用しています。この関数は、インジケータ 配列の計算に関与するいくつかの静的 変数を宣言しています。

指標計算を修正するために指標パラメータを変更したい場合(静的変数に依存する)。

再初期化を担当するライブラリ関数にフラグを渡す (スタティック変数を持つ各関数の入力パラメータを拡張する必要がある)

本体でスタティック変数をゼロにし、計算が完了する前にフラグを外すことを忘れないようにしてください。

静的変数に宣言時に設定するパラメータがあれば、再初期化時にこれらの変数がゼロにリセットされるかどうかを決定することができ、より簡単になります。

 
Renat:
新しいコンパイラと新しい実行環境は、コードの品質をより厳しく管理することに注意してください。 MQL4のコードの多くは、サードパーティの開発者が手を下して書いたものですが、今後はこれらの欠陥がすぐに目に付くようになります。
MQL4ハンドブック(エディター内にあるもの)もそれに合わせて更新されているのでしょうか?