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

 
A100:

原則的には、そのようなケースはないはずです。この問題は、(C++のように)コンパイラレベルで解決されているはずです。そして、この場合、それは一種の可能性であり、そのために議論が何ページにもわたって続くのである

間違いなくバグだ...。でも、そうでなければならないのです)))

定数式はコンパイル時に、静的式は記述順序のアプリケーションの初期化時に知る必要があるとイミフです。

と、MQLのこのスキームでは、定数制御のようなものがありますが、実行時に自分で定数を割り当てたり、関数呼び出しを 初期化として使ったりすることが可能です。

struct A
{
   const double a;
   A():a(AccountInfoDouble(ACCOUNT_BALANCE))
   {
      Print("a = ", a); // a = 9999.290000000001
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a1;
}
//+------------------------------------------------------------------+

そして、この「定数」は、局所的な視認性であってもよい......。は、どの時点で一定の表現になり、どのように役立つのか......。マニュアルがないとわからない、メモリモデルの記述がない、意味がない、まあせいぜい、本来の使い方である、すべてのコンストラクタで定数で初期化し、将来誤ってこのフィールドを変更することになった場合にコンパイラが警告するようになる

 
Igor Makanu:
しかし、MQLのこの方式は、定数に対するコントロールのようなものがありますが、私自身はランダムモードで定数を割り当てることが できます。

C++の 基本的な無知で何度恥をかけば気が済むんだ?

 

この例は、まったくもって紛らわしい。

struct A
{
   const double a;
   A():a(SymbolInfoDouble(_Symbol,SYMBOL_ASK))
   {
      Print("a = ", a);
   }
};
void OnTick()
  {
   const A a;
  }
//+------------------------------------------------------------------+

2020.04.23 21:40:04.474 tst (EURUSD,H1) a = 1.07892

2020.04.23 21:40:04.546 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:04.585 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.254 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.305 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.306 tst (EURUSD,H1) a = 1.07892

 
Stanislav Korotky :

同じファイルに対して、同時に2つのプログラムが動作しています。書き込む方は、FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ フラグを使用します。 読み込む方は、FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READフラグを使用します。最初のプログラムは定期的にFileFlushでファイルを保存していますが、2番目のプログラムはファイルを開いた時にしかその長さを確認しません。FileSeekを行ったり来たりしてみましたが、役に立ちません。

質問:ファイルを読み込むプログラムに、書き換え中のデータを拾わせるにはどうしたらいいでしょうか?

これはバグのようで、少し前に英語のフォーラムで報告されました。ここで報告する時間がなかったのです。

開発者は英語のフォーラムを読まないのですか?

 
Stanislav Korotky:

同じファイルに対して、同時に2つのプログラムが動作しています。書き込む方はFILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ フラグを使用します。 FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READを読み取るもの。最初のプログラムはFileFlushを使用して定期的にファイルを保存しますが、2番目のプログラムはファイルを開いたときにのみファイルの長さを確認します。FileSeekを行ったり来たりしてみましたが、役に立ちません。

質問:ファイルを読み込むプログラムに、上書きするデータを拾わせるにはどうしたらいいでしょうか?

2つのプログラムは同じ端末にあるのですか、それとも2つの異なる端末にあるのですか?

 

参照渡しされたオブジェクト配列からのオブジェクトメソッドが動作しない。

//+------------------------------------------------------------------+
//| Пример: добавленный метод для расширения файла ..\Include\String\String.mqh
//|--
//| Получает из указанной строки подстроки по заданному разделителю 
//| и возвращает количество полученных объектов-подстрок
//|         НЕ РАБОТАЕТ !!!!!!!!!!
//+------------------------------------------------------------------+
int CString::Split(const string separator,      // разделитель
                   CString      &result[] )     // массив строковых объектов
  {
   string tmp_result[];               

   if(StringLen(separator)==0) return(0);

   ushort u_sep=StringGetCharacter(separator,0); 
   
   int count=StringSplit(m_string,u_sep,tmp_result);

   // временно для проверки
   result[0].Assign("Buy"); // НЕ РАБОТАЕТ !!!!!!
   Alert("ressult[0] = ",result[0].Str()); // <--- уже не отрабатывает
   // конец временно
   
   /*
   for(int i=0;i<count;i++)
     {
      result[i].Assign(tmp_result[i]); // НЕ РАБОТАЕТ !!!!!
     };
   */
   
   return(count);
  }
//+------------------------------------------------------------------+
 
Slava:

この2つのプログラムは、同じターミナルにあるのですか、それとも2つの異なるターミナルにあるのですか?

一つの端末でエキスパートがデータを書き込み、インジケータがデータを読み込む。異なるチャートにぶら下がっているが、明らかに同じチャートである可能性がある(それが重要なら)。ビルド2380。

 

VS2019

#include <iostream>

int x;

struct A 
{
    const int a;
    A() :a(x) {}
};
int main()
{
    std::cout << "x = ";
    std::cin >> x;
    const A a;
    std::cout << "a.a = " << a.a;
}

x = 12345

a.a = 12345

うーん、MQL5と同じように動作していますね。

OK、取り消します、Sharpではコンパイルできません。

 
Vict:

さて、コンストラクタもありますね。もちろん、それはあなた次第ですが、構造体はCエンティティであり、そこでのモデルは、外部ロジック(機能)を持つ受動的なエンティティという、異なるものなのです。

必ずしもそうではありません。なぜCなのか、C#はどうなのか?- 受動的な構造の話は古臭い。 少なくとも、すべての型にはコンストラクタが必要だと思う。 未初期化のフィールドは悪であり、避けなければならない。

あなたの場合、構造体の配列を作成するファクトリーメソッドを作る必要があります、つまり、次のようなものです。

struct A
{
  const int a;
  A(int init_value) : a(init_value) { }

  static bool CreateArray(A &array[], int count, int init_value)
  {
    //...
  }
};

そして、既に提案されている配列の要素を埋める方法の1つがあります。

 

次のような問題が発生しました。ローソク足が描画されるインジケーター

チャート上にプロットされています。インジケーターのバッファを読み込むExpert Advisorもある

そこで、ログインしてステージをざっと見てみたところ、インジケーターが遅延してローソク足を描くことが多いことがわかりました。

数ティック前(正確には数分前まで)にすでに計算されてバッファが更新され、Expert Advisorがそこからデータを読み出していることを意味します。

(フクロウもインジケーターもログに書き込む)。しかし、チャートには昔の絵が描かれています。例えば、このスクリーンショットは、赤いバーが前のバーの安値を突破した瞬間に作られたものです。しかし、チャート上では、前の赤と描画不足の緑しか見えません(実際には2本分大きい)。


で、これが実際の絵なんですが、後から描いたものです。スクリーンショットのキャプチャが開始されました。ログによると、すべてクリアしています。



何が問題で、どうすればチャート更新を高速化できるのか、どなたか教えてください。 EAからChartRedraw 関数を呼び出すが、まだ数分の遅れがある。

2分というのはちょっと無理がありますね、理由も想像がつきません。計算がそんなに遅くなるのは、宇宙的なことではありません。