エラー、バグ、質問 - ページ 2046

 
Alexey Viktorov:

この初期化が可能です。なぜなら、変数 'a' は定数で初期化され、変数 'b' は定数式で初期化されるからです。

ここでは、'b' は定数式で NOT 初期化されている。そのため、ドキュメントに記載されているルールと矛盾しているのです。

全体の問題としては関数によって静的変数が初期化さ れると、初期化が「一時停止」され、関数が実行 されることです。上の例では、その関数の中にまだ初期化されていないスタティック変数があります。したがって、関数で初期化された変数は、別の値をとります。

しかし、どのようにして初期化を一時停止することができるのでしょうか。すべての操作は、言語構文で定義された厳密な順序で実行されます。まず、関数を実行し、その戻り値を変数のコンストラクタに渡す、これを初期化と呼びます。しかし、この場合、コンパイラはこの初期化操作をあからさまに無視し、何もなかったかのようにコードをコンパイルし続ける。これは許せません。これは、例えば次のような配列を宣言した場合と同じです。int a[]= { f(), g(), h() }; とすればコンパイルできますが、もちろん何も初期化されないままです。

 
A100:

32ビット端末で、OPTIMIZEを実行するとエラーが発生する。

リアル。MT4で確認したところ、確かにどのような形でもエラーは発生しています。そして、新しいビルドでそこに何かをコーディングする人々の方法
 
Alexey Navoykov:

ここで、'b' は定数式 NOT で初期化されます。つまり、ドキュメントに記載されているルールに反しているわけです。

初期化を一時停止するにはどうしたらよいですか?すべての操作は、言語構文で定義された厳密な順序で実行されます。まず、関数を実行し、その戻り値を変数のコンストラクタに渡す、これを初期化と呼びます。しかし、この場合、コンパイラはこの初期化操作をあからさまに無視し、何もなかったかのようにコードをコンパイルし続ける。これは許せません。これは、例えば次のような配列を宣言した場合と同じです。int a[]= { f(), g(), h() }; とすればコンパイルできますが、もちろん何も初期化されないままです。

定数式でないなら、WHAT?

アレクセイ、自分でそのコードを取って、デバッガで初期化シーケンスに目を通せば簡単だよ。また、すぐには気がつかなかったのですが、この例では

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

アレクセイ・ナヴォイコフ さん 2017.10.17 20:31

そして、変数の初期化については、こちらが詳しいです。ドキュメントに書かれていることに従えば、他のグローバル変数や静的変数も参照できないことになります。一定の表現ではないため。

int a= 1;
int b= a+1;  // Согласно документации, такая инициализация не возможна

void OnStart()
{
  Print(b);
}

しかし、今のところうまくいっています。そして、多くの人が気づかないうちに、いつもそのような構成を使っていたのでしょう。しかし、開発者がいつそれを無効化してもおかしくないことが判明しました。また、関数の初期化の場合と同様に、これらのコードはコンパイルには成功しますが、正しく動作しません。つまり、MQLのコード全体が時限爆弾なんです。


これはグローバルレベルの変数で、関数内にある静的な変数ではありません。

説明するほどの知識もないし、気配りも足りない。"suspended " を逆カンマで!!!!

静的変数と普通の変数の初期化を混同しないように、ローカル変数の場合はなおさらです。

 
Alexey Viktorov:

定数式でないとしたら、何によって?

定数でない式。

また、すぐに気がつかなかったのですが 重要なのは、この例ではグローバルレベルの変数について述べているのであって、関数内にある静的な変数について述べているのではないということです。

わかりやすく説明できるほどの知識はない。 そして、あなたは注意力がない...

何か勘違いしてませんか?

また、グローバル変数とスタティック変数の挙動は全く同じである。以下はそのドキュメント です。

グローバル変数は、その型に対応する定数または定数式によってのみ初期化することができる。

正直なところ、静的変数と同じくらい、私自身にも大きな発見がありました。いつ頃か、あるいはもっと前からドキュメントに書かれていたのかもしれませんが、誰も気に留めていませんでした。

 
Alexey Navoykov:

定数でない式。

混同してませんか?

さらに、グローバル変数とスタティック変数の挙動は全く同じ です。以下は、ドキュメントからの引用です。

正直なところ、これは静的変数と同じくらい驚かされたことでした。しかし、実際にC++で動作している以上、誰も気に留めることはなく、疑問も生じませんでした。

絶対に間違っていると思います。プログラム中に定義されたすべての関数から 利用できる変数と、宣言された関数でのみ 利用できる変数がある場合、変数の同一性についてどのように話すことができるでしょうか。

そして、スタティック変数とローカル変数の違いは、スタティック変数はグローバル変数の直後に初期化され、通常のローカル(非スタティック)変数はプログラムの実行 中に、コードがその変数にたどり着いたときに初期化されることです。

 
Alexey Viktorov:

完全に勘違いしているようですね。プログラム中に定義されたすべての関数から アクセスできる変数と、宣言された関数の中だけで アクセスできる変数とがある場合、どうして同一の変数であると言えるのでしょう。

一般的な話ではなく、特定の文脈(変数の初期化)の話だったんですね。

 
フルチャットでメッセージを送信した後、送信したメッセージは現在のページのチャット履歴に自動的に追加されません。
送信されたメッセージは、ページを再読み込みした後に表示されます。

ざっと見たところ、メッセージ送信時のサーバーからの応答は適切で、jsコードのイベントハンドラで何か問題があったのかもしれませんね。
 
Alexey Navoykov:

一般的な話ではなく、特定の文脈(変数の初期化)についての話でした。

私の記憶では、STATIC変数の初期化についてだったと思います。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

アレクセイ・ナヴォイコフ さん 2017.10.17 17:16

静的変数の初期化に関する バグ。古いビルドでは存在しなかった。

class A
{
 public:
  static int f()
  { 
    static int a=1;
    Print(a);       // Получаем a=0 !!
    return a;  
  }   
};


int a= A::f();


void OnStart()
  {
   
  }

気になる人は、サービスデスクに送ってください。もうそこでコミュニケーションを取る気はない。


それとも、これはあなたのメッセージではないのですか?

もう、変数の初期化シーケンスを整理してください。この例では、まずグローバル変数が初期化されます。

int a= A::f();

これは、同じ名前の変数をまだ初期化していない関数を呼び出すものです。

static int a=1;

そして、コンパイラの警告に注意を払わずに何を話しているのか...。


 
Alexey Navoykov:

しかし、そこで間違った配列次元を 設定してしまったので、もしかしたら何らかの影響を受けてしまったのかもしれません(全く影響しないはずなのですが)。

dimension = 3 で試してみてください。

メッセージをありがとうございました。
確かに、コンパイラのオプティマイザのエラーである。
この修正は次のビルドに含まれる予定です。
 
Alexey Viktorov:

私の記憶では、STATIC変数の初期化についてだったと思います。

それとも、それはあなたのメッセージではないのですか?

何がしたいのか理解できない。私は「変数の初期化」についての話だと言った。そして、この文脈では、スタティック変数とグローバル変数の動作は同じです。ドキュメントへのリンクも用意しました:変数の初期化

静的変数とグローバル変数は、どこでも一緒になっていることに注意してください。

また、初期化シーケンスについては、当面の問題とは関係ないので、批判はしません。問題は、コンパイラがエラーを発生させるべきところで、エラーを発生させないことです。静的変数がまだ初期化されていない場合は、アクセスできません。

しかも、コンパイラの警告を無視して何を話しているんだ...。

まあ、そんなに気になるなら、グローバル変数の名前を変えればいい。結果には何ら影響を与えません。