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

 
Roman:

もし、この値のエラーをキャッチする必要があれば、333で初期化してください ))
あくまで開始値です。

そうです、バグなんです。ですから、初期化されていない変数を代入したときに、すべてのケースで警告を出すか、あるいは出さずに、同じケースで言語内で、たとえばデフォルトのゼロで初期化するか、どちらかです。

 
Valeriy Yastremskiy:

そうです、バグなんです。その結果、すべてのケースで未入力の変数を割り当てる ように警告を出すか、あるいは警告を出さずに、同じケースで言語内で、たとえばデフォルトのゼロで開始させるかのどちらかであることがわかりました。

上記の例のうち、どこにそのような事例があったのかだけ教えてください。

 
A100:

上記の例のうち、どこにそのような事例があったのかだけ教えてください。

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

バグ、バグ、質問

A100, 2020.10.27 16:11

初期化する必要がありますが、意味のある値でなければなりません。上記の例ではそのような値はないので、唯一可能な練習は悪くないと思います。そうでなければ、二重の初期化が発生します

int f( int i ) { /*вычисления*/ }
void g( int k )
{
        for ( int i = 0, j; i < k; i = j )
        {
                j = f( i );
                /*вычисления*/
        }
}

 
Roman:

また、未初期化の変数の代入は どこにあるのでしょうか?どの変数が初期化されていないのか、そして誰に割り当てられているのか?あなたが強調したこと:右の=jではなく、左のj=からj、つまり、それ自体が値を割り当てられる 前に誰かに割り当てられることはありません。

 
A100:

上記の例のうち、どこにそのような事例があったのかだけ教えてください。

そうなんです。おそらく、コンパイラは行単位でトップダウンするのでしょう。その場合、はい、代入は下に、その逆は上にあります。また、初期化されていない変数に代入される可能性があるという警告も出ています。

 
A100:

また、未初期化の変数の代入は どこにあるのでしょうか?どの変数が初期化されていないのか、また、その変数は誰に割り当てられているのか?強調表示されているのはj=であり、=jではありません。

ループ本体 で、初期化されていない変数に代入された。最初の反復処理前 jはまだ初期化されていません。
最初の反復処理通過後に初期化されます。
ループ本体が最初に実行され、その後、インクリメンタルスコープが実行される。i = j に置き換えていますね。

 
Roman:

関数本体で、初期化されていない変数に代入している。最初の反復の前 jはまだ初期化されていない。
最初の反復の後、初期化される。
関数本体が先に実行され、その後にインクリメント領域が実行される。i = j に置き換えていますね。

いや、その通り、最初の反復でjを推論しないのはj=f(i)で、2回目はi=jになるだけです。コンパイラは上から下へ解析して警告を出しているのだと思います。

 
Valeriy Yastremskiy:

いや、その通り、最初の反復では変数jは初期化されずj=f(i)となり、2回目の反復ではi=jとなるだけです。コンパイラは上から下へと解析して警告を出すと思います。

はい、しかし、最初の反復の前に、j変数はまだ初期化されていません、これは、コンパイラが悪態をついていることです。

 
Valeriy Yastremskiy:

そうです、間違っていました。初期化されていない変数のすべてのケースで代入があり、その逆ではありません。多分、コンパイラはトップダウンで進むので、そう、代入は下に、その逆は上にあるのでしょう。また、初期化されていない変数に代入される可能性が あるという警告も出ています。

これは、コンパイラが客観的に何も情報を持っていない場合である。

void f( int& i ) { /*вычисления*/ }
void OnStart()
{
        int i;
        f( i );
        int j = i; //нормально ??? а если i не инициализирована?
        printf("%d",j);
}

つまり、f()はiを初期化していたかもしれないし、していなかったかもしれない。そしてここで、C++コンパイラは警告を出すが、MQLの方はなぜか警告を出さない。

 
A100:

これは、コンパイラが客観的に何も情報を持っていない場合である。

つまり、f()はi初期化をしていたかもしれないし、していなかったかもしれない。そして、ここでC++コンパイラは警告を出しますが、MQLは警告を出しません。

もっとシンプルなコンパイラがいいと思う。レイアウトの構文を上から下へ解析し、明らかな構文エラー、型の無視、間違った変数の使用などを検出します。2番目の例では、初期化を置いても、警告は発生しませんでした。プログラムの実行は同じですが