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

 
Alexey Navoykov:

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

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

バグではなく、ここから 議論されています。より抜粋

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

mql4言語の特殊性、ヒントとコツ

アレクセイ・ビクトロフ さん 2017.04.30 08:54

初期化シーケンスです。(ご存じない方のために)

まず、グローバルレベルの変数、次に 関数の優先順位に応じて配置されるスタティック 変数、OnInit()、OnTick()、OnCalculate()...といった具合です。さらに、私の時代にはローカルなものには興味がなかったのです。つまり、このコードでは、静的変数が初期化さ れる前に関数が呼び出されるため、このようなエラーが発生することが判明しました。変数が初期化される前に関数が呼び出される

 
fxsaber:

バグではなく、ここから 議論されています。より抜粋

つまり、あなたとアレクセイ・ビクトロフの間で議論されたのなら、それがバグではないと信じる根拠となるのですね?)そして、この人自身、自分のプログラミング知識のレベルはあなたよりずっと低いと言っています。つまり、リストから除外することができるのです。残っているのはあなただけです)。自分と相談した結果、バグではない)

バグである。変数の初期化が無視され、それを飛び越えてコードが実行され続けるということは、原理的にありえないのです。これはナンセンスだ。また、ここでは初期化の順番は関係ありません。この変数は初期化されるか、コンパイラがここでエラーを発生させるかのどちらかです。第三の道はないのです。そうでなければ、プログラミング言語ではなく、何か別のものです。

 

新しいビルドの別のバグ。

template<typename T>
int F1(const T& array[])
{
  return ArrayMaximum(array);
}


template<typename T>
int F2(const T& array[]) { return F1(array); }


void OnStart()
  {
    int arr[4]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }


えー、この辺は下品なんですね。古いビルドではマーケットで商品を受け付けないため、新しいビルドにアップグレードしようと思ったのです。そして、ここにバグの上にバグがある!?

 
Alexey Navoykov:

では、あなたとAlexey Viktorovの間で議論されたのなら、それがバグでないと信じる根拠となるのですね?)そして、この方自身、自分のプログラミング知識のレベルは、あなたよりずっと低いと述べています。つまり、リストから除外することができるのです。残っているのはあなただけです)。自分と相談した結果、バグではない)

バグである。変数の初期化が無視され、それを飛び越えてコードが実行され続けるということは、原理的にありえないのです。これはナンセンスだ。また、ここでは初期化の順番は関係ありません。この変数は初期化されるか、コンパイラがここでエラーを発生させるかのどちらかです。第三の道はないのです。そうでなければ、プログラミング言語ではなく、何か別のものです。

消していいんですよ。「自分はどんなプログラマーなんだろう」と指をくわえて見ていることはないですから......。

お母さんはドキュメントを読めって言わないの?そんな方のために、特にドキュメントからの引用を挿入してみました。

取引、自動売買システム、取引戦略のテストのためのフォーラムが1つあります。

mql4 の特殊性、ヒントとコツ

アレクセイ・ビクトロフ さん 2017.04.29 12:50

ヘルプにstatic variable...と書いてありますが大丈夫でしょうか?よみきる

静的変数は、任意の式で初期化できる単純なローカル変数とは異なり、その型に対応する定数または定数式で 初期化することができます。


でも、機能ではありません。

このような仕組みになっています

#property strict
#property indicator_chart_window

int TestBrokenStatic()
{
   static int stInt = 101;
   stInt++;
   return stInt;
}

int OnInit()
{
   static int result = 0;
   result = TestBrokenStatic();
   Print("TestStatic Expected result 102   - Actual result=", result);
   result = TestBrokenStatic();
   Print("TestStatic Expected result 103   - Actual result=", result);
   
   return INIT_SUCCEEDED;
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}
2017.04.29 13:49:51.546 !Test USDCHF,M15: TestStatic Expected result 103   - Actual result=103
2017.04.29 13:49:48.457 !Test USDCHF,M15: TestStatic Expected result 102   - Actual result=102
2017.04.29 13:49:40.089 Custom indicator Test\!Test USDCHF,M15: loaded successfully

 
Alexey Navoykov:

新しいビルドの別のバグ。

えー、この辺は下品なんですね。古いビルドではマーケットで商品を受け付けないため、新しいビルドにアップグレードしようと思ったのです。そして、バグの上にバグがある!?

そして、正しく理解した!

 
Alexey Viktorov:

消していいんですよ。「自分はどんなプログラマーなんだろう」と指をくわえて見ていることはないですから......。

お母さんはドキュメントを読めって言わないの?特にこのような方々のために、ドキュメントからの引用を挿入しておきます。

なるほど、それならすぐには気づかず、失礼しました。もちろん、誰にも気づかれずに変更できたのはすごいことです。理解できないのは、なぜコンパイラは無効な演算が実行されたことに反応しないのか、ということです。I.e.どのような場合でもバグがある
 
fxsaber:

ちゃんとしたものがあるんだ!


うーん、どんな体格なんだろう?私のは1653です。

 
Alexey Navoykov:

では、あなたとAlexey Viktorovの間で議論されたのなら、それがバグでないと信じる根拠となるのですね?)そして、この方自身、自分のプログラミング知識のレベルは、あなたよりずっと低いと述べています。つまり、リストから除外することができるのです。残っているのはあなただけです)。自分と相談した結果、バグではない)

バグである。変数の初期化が無視され、それを飛び越えてコードが実行され続けるということは、原理的にありえないのです。これはナンセンスだ。また、ここでは初期化の順番は関係ありません。この変数は初期化されるか、コンパイラがここでエラーを発生させるかのどちらかです。第三の道はないのです。そうでなければ、プログラミング言語ではなく、何か別のものです。

その結果について論理的な(整合性のある)説明を見つけた場合、私はバグを見ません。C++と結果が一致しないのにバグを証明することは許されないと思います。そう考えて実行したのはC++の中の人です。でも、そう思っていなかったから、やらなかったのかもしれない。だから、外にあるものを参考にするのではなく、自分の中の「こうでなければならない」という概念に頼ったほうがいいんです。そして、この「自分のもの」が、本当に自分のものであることが望ましいのです。また、プログラミングの経験を積んでいくうちに、「こうあるべき」という固定観念が気づかないうちに押しつけられた結果でもありません。

間違ってもいいんです。自分のレーキで少しずつ勉強しているところです。

 
Alexey Navoykov:

うーん、どんな体格なんだろう?1653を持っています。

1653x64.

 
fxsaber:

1653x64.

それなのに矛盾があるのは不思議ですね......。


誰かに自分自身で確認してもらう。