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

 

MT 4. OnTick() 内の MathRand()乱数発生器。 ふくろうのテストでは、同じ設定で再度実行すると、異なる結果が得られます。生成された数値がアルゴリズムに影響を与えるのであれば、これは当然のことです。

最適化を行うと、なぜか同じ設定で2回目の実行でも同じ結果が得られます。つまり、最適化モードではMathRand()は動作しないのですね。

 
Сергей Таболин:

次に、(ここで間違いを犯すかもしれないので、Alexander Puzanovに 訂正してもらいたいのですが)プログラマが何らかの理由で動的配列に インデックス20の項目を追加することにしても、何も悪いことは起こりません。配列はこの次元を取り、そこに値を書き込み、「足りない」インデックスをゼロ値で初期化します。

その通りです。なぜ「ゼロ」なのか?EMPTY_VALUEにすべきなのでは?それともWRONG_VALUE?

このような暗黙の代入の問題は、まさにその暗黙の性質にあります。コンパイラがあるコードを導入すると、あるプログラマはある方法を考え、別のプログラマは異なる方法を考えるかもしれません。

さらに非効率的です。変数をすぐに初期化する必要があるとは限りませんし、ループの中で大きな配列を初期化すると、速度が著しく低下してしまうからです。

そして3つ目は、プログラマーが次元と使用するインデックスをコントロールすることを誰も妨げないという ことですただ一つ違うのは、今はそれをせざるを 得ないということだ)))

もしコンパイラが配列の次元そのものを記録していたら、どのクラスもこのコードをクリーンアップすることはできないでしょう。効率が落ちる可能性は大いにあります。

同時に、コンパイラがこの作業を行わない場合、プログラマはこれを行うクラスを書き、必要に応じてゼロで拡張・初期化される配列を使用することができます。

2番目のケースでは、柔軟性が高くなります。

ですから、あなたが提案するものは、多くの場合、良い解決策にもなります。しかし、効率が悪くなる可能性があり、それは良くないことです。

 
Сергей Таболин:

これは原理的に、動的配列に 通常充填される方法の簡単な例である。長いことCで書いてないので覚えていませんが、phpでは配列はこうやって埋めるんですねー。すべてが論理的で理解しやすい。配列に要素を追加する(arr[] = x)と、配列は自動的に展開され、その要素は配列の末尾に追加されます。しかも、自分で伸ばす必要もないし、要素のインデックスを自分で指定する必要もない。しかし、ここでは絶対に無駄な動きをしなければならない。

その差は歴然としている...。

私見ですが、はっきり言っておかしいと思います ))))

プログラミング言語は、厳密に型付けされたものとそうでないものに分けられる。あなたが使っているPHPやRなどの関数型言語は、非厳格型に属します。MQLやC#、Javaのような厳格な型付き言語では、このような曖昧なデータ操作は許されない。そして、これは特にプログラマー自身の安全のために行われます。厳密な型付けとは、各手続きが極めて特殊であることを意味します。「配列のインデックス0の要素を取り出す」という手続きは特殊で明確ですが、あなたはそれを「配列から何かを取り出して、コンパイラが最初に返すと決めたものに追加する」と置き換えようと提案しているのです。- これでは埒が明かないということで合意したのでしょう。

一方、もちろん、面倒な配列のサイズ変更や、ユーザーによる頻繁な並べ替えのない、シンプルでハイレベルなコンストラクトも欲しいところです。そのための標準ライブラリなのです。基本的な配列を使用する代わりに、Arrayグループのクラスに切り替えてください。例えば、CArrayInt配列に0から16まで足すとこんな感じです。

#include <Arrays\ArrayInt.mqh>

void OnStart()
{
   CArrayInt array;
   for(int i = 0; i < 16; i++)
      array.Add(i);   
}

ご覧のように、自然すぎることはありません。また、現在の配列の大きさなど、並べ替えに頭を悩ませる必要もありません。厳密なタイピングの範囲内で、すべてをあなたに代わって行い、あなたはユーザータスクに直接集中するよう誘われるのです。これがOOPのパワーであり、ポイントなのです。

 

フル収録はしておりません。コンパイルエラー

template<typename T>
class A { protected:
        A( T t ) : t( t ) {}
        T t;
};
class B : A<int> {
        B() : A<int>( 1 ) {} //'<' - member(s) initialization expected
};
 

どこが間違っているのかがわからない。

課題は、ある区間における最大 値と最小値を求める ことである

void OnStart()

  {
int            Kol_Kan=10;       //Количество элементов для копирования
double         HI[];             //массив для хранения максимумов на интервале
double         LO[];             //массив для хранения минимумов на интервале

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумов
CopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумов

ArrayResize(HI,Kol_Kan);         //устанавливаем размер массива
ArrayResize(LO,Kol_Kan);

int in_max=0;                    //индекс максимального значения в массиве
int in_min=0;

in_max=ArrayMaximum(HI,WHOLE_ARRAY,0); //Находим индексы максимума и мин в массивах
in_min=ArrayMinimum(LO,WHOLE_ARRAY,0);

double hi_max;                   // максимальное значение цены 
double lo_min;                   // минимальное значение цены

hi_max=HI[in_max];               //Переносим значения максимумов и мин в переменные
lo_min=LO[in_min];
Alert(hi_max,"___",lo_min);   

  } 
 

ArrayMaximum()、ArrayMinimum()の引数の順序が正しくない。

 
PabloEs:

どこが間違っているのかがわからない。

課題は、ある区間における最大 値と最小値を求める ことである

機能

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//極大値のコピー

CopyLow(_Symbol,0,2,Kol_Kan,LO); //極小 値のコピー

は、すでに配列のサイズを変更しています。

これは不要です

ArrayResize(HI,Kol_Kan); //配列サイズを設定 する。

ArrayResize(LO,Kol_Kan) です。

 
Sergei Vladimirov:

Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().

その通りです))そして、ここで私は考えました。

ウラジミール・パストゥシャク

機能

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//極大値のコピー

CopyLow(_Symbol,0,2,Kol_Kan,LO); //極小 値のコピー

は、すでに配列のサイズを変更しています。

これは不要です

ArrayResize(HI,Kol_Kan); //配列サイズを設定 する。

ArrayResize(LO,Kol_Kan) です。

これを知っておきます、ありがとうございました。

 
PabloEs:
それで、どうしたんですか、自分ではわからないんですか?
 

一方、著者はすでにそれを理解している。))

PabloEs:

その通りです))そして、ここで私は考えました。