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

 

ダイナミックアレイに関する 質問

double open_main_array[] - クラス変数.

初期化

ArraySetAsSeries(open_main_array,true);

次のコードを含む関数の1回目の呼び出し

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

2回目の関数呼び出し

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

open_main_arrayの配列には、2回目の呼び出しでコピーされたデータが含まれるのでしょうか、それとも配列がインクリメントされて1回目と2回目の呼び出しのデータが含まれるのでしょうか?

または、使用することができます。

ArrayFree(open_main_array)

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

uninitialized variable - 変数が初期化されていないときに通過分岐が保証 されていることを意味します。例えば、switchではdefaultが明示的に省略されていますが、この場合MainPriceは明示的に初期化(または宣言時に明示的にゼロクリア)されなければなりません。

合格保証」について。そんなコードの一部を紹介します。

            (1)         double local_low;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion=false;
            (4)         for(uint n=1;n<Ac-k;n++)
            (5)           {
            (6)            if(low[index_interior-n]<low[index_interior-n-1])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion=true;
            (10)              break;
            (11)              }
            (12)          }  
            (13)        if(interrupcion)
            (14)          {
            (15)           if(EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

最後の行(15行目)については、「初期化されていない変数 'local_low' を使用している可能性があります」とあります。

しかし、8行目で変数 local_lowを初期化 した直後に9行目でbool-変数interrupcionを使用しているため、15行目で変数local_lowが初期化されることが保証さ れることが判明しました。つまり、この時点では、「初期化されていない変数 'local_low' の使用の可能性」という警告は、「保証される」という意味ではなく、その変数が初期化されていない通過ブランチが存在する可能性が あるという意味に過ぎないのです。

 
Yedelkin:

通過保証」について。以下はコードの一部です。

最後の行(15行目)については、「初期化されていない変数 'local_low' を使用している可能性があります」とあります。

しかし、8行目で変数local_lowを初期化した直後に9行目でbool-変数interrupcionを使用しているため、15行目で変数local_lowが初期化されることが保証さ れることが判明しました。つまり、現時点では、「初期化されていない変数 'local_low' の使用の可能性」という警告は、「保証される」という意味ではなく、その変数が初期化されていないパススルーブランチが存在する可能性が あるという意味に過ぎないのです。

まさにその通り、警告を発してくれるのです。

自己満足と 現実を混同しないように。何度もプロジェクトを 重ねるうちに現実が見えてきて、「理屈ではこうなるはずだ」と理解することは日常茶飯事です。

 
Renat:

自信と 現実を混同してはいけない。何度もプロジェクトを重ねるうちに現実が見えてきて、「論理がそう導くからこんなはずではなかった」と気づくことは日常茶飯事です。

適切な説明を受けられるか?コードが示され、「独善的」な発言が述べられているが、どこに間違いがあるのか?密教は理解できない。

...「初期化されていない変数の使用の可能性 」という訳語を考えると、確かに「絶対正しい」という警告が出されています。しかし、それは「保証されている」ということではなく、「変数が初期化されていないパスの分岐が存在する可能性が ある」ということに過ぎない。それこそ「自信満々」です。

 
Yedelkin:

適切な説明を受けられるか?コードが示され、「独善的」な発言が述べられているが、どこに間違いがあるのか?密教は理解できない。

の代わりに、次のようなものがあったらどうでしょう。

interrupcion=true;

代わりに

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
あなたもクレームをつける?特にsomeFunctionNが数百行のコードで構成されている場合は?

あなたのコードによると、はい、15行目が実行されると、変数が初期化されます。しかし、私が挙げた例では、コンパイラに何を指示するのでしょうか?その作業は大変です。そして、それを解決する必要もないのです。

このエラーは「初期化されていない変数を使用した可能性がある (かもしれない)」というものです(どうせわかっていることでしょうが)。

変数local_lowに明示的に何らかの値を代入した方が良い。私を信じて、それは将来起こりうるエラーからあなたを救うことができます(コードは修正され、何かが削除され、何かが移動し、何かが変更され、そして13行目はこのプロセスから落ちることができます)。

 
Yedelkin:

適切な説明を受けられるか?コードが示され、「独善的」な発言が述べられているが、どこに間違いがあるのか?密教は理解できない。

現実の世界では、どんな言語でも大多数のプログラマーが全く無防備で不具合の多いコードを書くので、コンパイラは可能な限り厳密に作られるべきなのです。プログラマーの「論理は明快、問題はないはず、すべて初期化されているはず」という自己満足は、多くのエラーをもたらし、今も、そしてこれからももたらすだろう。

だから、厳しい措置への批判に関する質問は、ここでは関係ないのです。

 
Renat:

...プログラマーの「論理は明快、問題はないはずだ、すべて正しく初期化されている」という自信は、膨大な数のエラーをもたらし、もたらし、これからももたらすだろう。

だから、厳しい措置への批判は ここでは関係ない。

批判は抜きでやりましょう。特に、私の言葉では言い表せなかった。また、私の批判があることについて、あなたは深く誤解しています。

では、あなたのエラーは何ですか?密教を暗号にすることはできないので、論理の言葉で答えてください。つまり、プログラマーなら誰でも理解できる言語で。

 
notused:

あなたもクレームして みませんか?特にsomeFunctionNが数百行のコードで構成されている場合は?

あなたも同じ場所にいるのですね。まあ、特に不満はないんですけどね。ただ、レナトが言うように、すべてが断定的なものではないということは、はっきりさせておきたい。

コードについてはどうでしょう。普通の論理でRenatの発言のcategoricalnessを反証するコードの具体例をあげました。アドバイスありがとうございます!常に向上心を忘れないようにしています。

 
Yedelkin:

批判は捨てましょう。特に、私の言葉では言いませんでした。また、私の側からの批判の存在については、深く誤解している。

さて、あなたの失敗は何ですか?密教を暗号にすることはできないので、論理の言葉で答えてください。つまり、プログラマーなら誰でも理解できる言語で。

初期化されていない変数 'local_low' の使用の可能 性あり」となっています。

そして、次のような場合、何が得られるでしょうか。

(1)         double local_low=1.1; // или что-то другое
 
Yedelkin:

では、ミスとは何でしょうか。コードに難解なものを入れることはできないので、論理の言葉で答えてください。つまり、プログラマーなら誰でも理解できる言語で。

多くのソフトウエアプロジェクトを 世に送り出してきたソフトウエア会社の経営者の視点から、私の回答を読み直してみてください。

そうでないと、「プログラマーなら誰でもいい」というレベルのまま、何が間違いなのかがわからなくなってしまうのです。