[警告は閉鎖されました!】フォーラムを乱雑にしないために、どんな初心者の質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしでは、どこにも行けない。 - ページ 1086

 
drknn:


じゃあ、これは何なんだ?

bool Fun_New_Bar() // Fun_New_Bar 検出 fi
{ // ... 新しいバー


static datetime New_Time=0; // 現在のバーの時刻

これを静的変数初期 化といいます。ゼロはこの変数が初期化されたときのみ代入される。
 
khorosh:
これを静的変数の初期化といいます。ゼロは、その変数が初期化されたときのみ代入されます。 。


やばい!かっこいい。サブルーチンが呼び出され、スタティック変数が 初期化された。サブルーチンが終了し、その変数がRAMアドレス空間に残されました。そして何より、空間そのものを忙しさから解放することなく、ですね。

サブルーチンでの静的な初期化は、NEWの新しいティックごとに行われます!!!!これは、すべてのサブルーチンのすべての変数の初期化に適用されます。スタティック変数のスコープとライフタイムは、はて?

 
drknn:

やばい!かっこいい。サブルーチンが呼び出され、スタティック変数が初期化された。サブルーチンが終了し、その変数がRAMアドレス空間に残されました。そして何より、空間そのものを忙しさから解放することなく、ですね。
正常に動作しているかどうかを簡単に確認することができます。なぜ、このような理論付けをするのか。実践こそが真理の基準です。ふとしたきっかけで、自分の知識のギャップを確認できたら嬉しいはずです。そんな時はいつも嬉しくなって、啓発してくれた人に「ありがとう」と言うことにしています。
 
drknn:


やばい!かっこいい。サブプログラムが呼び出され、スタティック変数が初期化された。サブルーチンが終了し、その変数がRAMアドレス空間に残されました。そして何より、空間そのものを忙しさから解放することなく、ですね。

サブルーチンでの静的な初期化は、NEWの新しいティックごとに行われます!!!!これは、すべてのサブルーチンのすべての変数の初期化に適用されます。スタティック変数のスコープとライフタイムは、はて?


はい、M1グラフで確認してください結局のところ、すべてが思い通りに動いている、ように見えるのですしかも、毎回のティックではなく、新しいティックが 形成されたときだけビープ音が鳴るのです

int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}

 
khorosh:
動作確認も簡単です。なぜ、こんなにも理論的なのか?実践こそが真理の基準です。自分の知識のギャップを知ったら、喜ぶはずです。このような場合、私はいつも満足し、啓発してくれた人に感謝します。 。


私もそう思います。ちょっと興奮しちゃいました。申し訳ございませんでした。スタティックを確認する。スクリプトを書く。

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  int SchVizovov=0;
	for(int i=1;i<5;i++){
		SchVizovov=Proverka(i);
	}
  Alert("-------------------");
	return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+
int Proverka(int Sch){
	
	static int My_value=0; //
	if(My_value==0){
		My_value=Sch;
		Alert("Статическая переменная инициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
		return(Sch);
	}
	else{
	 My_value=Sch;
	 Alert("Статическая не реинициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
	}
	return(Sch);
}

それをコンパイルして、チャートに投げる。その結果、http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg。

まあね。残念ながら、スタティックが再初期化されていないことを認めざるを得ません。そうすれば、このコードは動作します。これはまずい。:( 言語のヘルプで、そのようなニュアンスの説明があるはずです。ヘルプには、静的変数は 関数終了時に値を失わないことだけが書かれています。しかし、この変数が再初期化されるときに再初期化しないとは書いていない。げっ、またメタエディタのヘルプが不完全なことにぶち当たってしまった。げっ、もう捕まることはないと思ったのに :)))))))))))))))))))))))))))))))))))))

 
drknn:


私もそう思います。ちょっと興奮しちゃいました。申し訳ございませんでした。スタティックを確認する。スクリプトを書く。

それをコンパイルして、チャートに投げる。その結果、http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg。

まあね。残念ながら、スタティックが再初期化されていないことを認めざるを得ません。そうすれば、このコードは動作します。これはまずい。:( 言語のヘルプで、そのようなニュアンスの説明があるはずです。ヘルプには、静的変数は関数終了時に値を失わないことだけが書かれています。しかし、この変数が再初期化されるときに再初期化しないとは書いていない。やばい、また釣られた。げっ、もう捕まらないと思っていたのに :)))))))))))))))))))))))))))))))))))))))))))

でも怒らないでください、みんなここで学んでいるんですから。たまたま、あるニュアンスが抜け落ちていて、すべてを知っていると思っていたのに、それを知ることになるのです。

リファレンスによると、スタティック変数の初期 化は一度だけで、そのような再初期化はないとのことです。

 
khorosh:
大事なのは動揺しないこと、私たちは皆ここで学んでいるのです。たまたま、あるニュアンスに気づかず、もうすべて知っていると思っていたのに、それを知ることになる。 。


自分の知識のギャップを発見したからといって動揺するわけではありません。自分のコードに欠陥を見つけて、それを見つけるのに1時間以上かかったとき、それが自分のせいではなく、ヘルプシステムやターミナルのバグだと判明したときに動揺するのです。この6年間のプログラミングの中で、このような問題に関連するエラーを見つけるために費やした時間を合わせると、私の人生のかなりの部分がゴミになったと言えるでしょう。それが悔しい。人生の 時間をくだらないことで浪費している。飛んでいって、二度と戻ってこない。しかし、今日の事態は動揺することなく、それどころか、夜通しでエラーを探す必要もなく、すぐに特定できたのは喜ばしいことでした。

ニコライさん、もう一度お詫びします。私は6年前から、関数内で値を初期化して宣言した変数は、その関数が再び呼ばれたときに再初期化されると考えていました。(端末のグローバルショートカットの変数については黙っています - それは別の曲です)。例外があることがわかった。今日はシンプルに王道なレッスンをしてもらいました

 
khorosh:

ヘルプによると、スタティック変数の初期化は一度だけで、そのような再初期化はないとのことです。

ヘルプを引用します。

静的変数は、専用のinit()関数を呼び出す前に一度だけ初期化されます。

そして、どこでスタティック変数を初期化したのでしょうか?サブプログラムの中で初期化ルールを破ったのは私たちです。

init()関数を呼び出す前に、スタティック変数が宣言されておらず、サブプログラムから呼び出されてもいない。これが混乱を招くのです。init()ブロックの前にスタティック変数の初期化が 行われていないので、プログラム構造の特定の断片に束縛されているため、特異点ルールは無効となります。について、ヘルプテキストに記載されています。しかし、それは満たされない。ワンタイム・ルールが無効であるにもかかわらず、再初期化はまだ起こらないのだ!

ポイントは、ワンタイム・ルールが硬直性をもたらしていることです。ここで、判断の主語と述語の間にある同値の関係が出てくるのである。つまり、一方がなければもう一方が存在しない、という等価関係です。

しかし、この文言は、シンギュラリティ・ルールの別の違反も許してしまうのです。この変数をあるべき姿で宣言し、初期化ブロックの前でのみ値を初期化できるようにすると、特異点規則に反するため、コード内の他の場所でこの変数を初期化することはできない。しかし、私が作ったスクリプトはそうではないことを示している。この変数は、その場で別の値で初期化することができるのだ。

私は自分のコードでこれらの変数を使ったことはありませんし、このようなルールに違反している以上、使うことはないでしょう。他にどんな落とし穴があるのかわからない。

 

問題がある

端末の 設定でメールを設定する際、SMTP - smtp.gmail.com:25を使用しています。

Mail: 530 5.7.0 最初にSTARTTLSコマンドを発行する必要があります。L3Sm2329679FAN.0
 
drknn:

ヘルプから引用します。

スタティック変数をどこで初期化したのか?サブルーチンの中で初期化ルールを破ったのはあなたです。

init()関数を呼び出す前に、スタティック変数が宣言されておらず、サブプログラムから呼び出されてもいない。これが混乱を招くのです。静的変数は初期化ブロックの前に初期化されていないので、プログラム構造の特定の断片に束縛されているため、特異点規則は無効である。これは、まさにヘルプに書いてある通りです。しかし、悪魔はそれを満たさない。特異点ルールが無効であるにもかかわらず、再初期化はまだ起こらないのだ!

また、チュートリアルの中でスタティック変数を 使用する例がありますが、これを見ると、一度だけ初期化することが明らかで、そうしないとティックカウンターが動作しないことが分かります。

//--------------------------------------------------------------------
// staticvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start()                            // Специальная функция start()
  {
   static int Tick;                    // Статическая локальная перем
   Tick++;                             // Счётчик тиков
   Comment("Поступил тик № ",Tick);    // Сообщение, содержащее номер
   return;                             // Оператор выхода из start()
  }
//--------------------------------------------------------------------