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

 
Koldun Zloy:

いいえ、コンパイル時にはまだ分かっていません。

では、SymbolInfoTickが 何百億回と呼び出さ れたときに、膨大な数のチェックを回避するためにはどうすればよいのでしょうか。

 
fxsaber:

では、SymbolInfoTickが 何百億回と呼び出さ れたときに、膨大な数のチェックを回避するためにはどうすればよいのでしょうか。

そんなことはない。文字列そのものをむやみにコピーしないようにするためだけのものです。

 
Koldun Zloy:

いいえ。文字列そのものをむやみにコピーしないようにするためだけのものです。

もし、オプティマイザーの効率を上げたいのであれば、SymbolInfo関数の 文字列参照の解決策は、明らかに正しいものです。

 

私のプロジェクトの1つでデバッガが動作しない。しかも、その挙動を予測することは困難です。時々、ブレークポイントに入るのを拒否する。また、一部の機能の入力も拒否されます。最初はアップデートが原因かと思ったのですが(デバッグで何か問題があったのかもしれません)。しかし、他のもっとシンプルなプログラムでは、すべてがうまくいくようです。メインプロジェクトに取り組んでいるので、あまりチェックしていませんが。かなり複雑で、私が設計したモジュールだけで15個あります(標準モジュールの数は数えていません)。メインモジュールには最大で2000行が含まれます。もしかしたら、プロジェクトの複雑さのせいかもしれないと思いましたが......。また、繰り返し使うコードスニペットには、マクロを使うところもあります。また、CAppDialog, CCheckGroup, CComboBox, CButtonなどの標準的なUI要素も、私のプログラムの機能に合わせて書き直したものを使っています。もしかしたら、それらが原因でデバッグがうまくいかないのかもしれない・・・例えば、私が特に書いたCCheckGroup::itemCheckState(const string item) メソッドは、デバッグされないんだ。このメソッドは、チェックボックスの項目を見つけ、それが選択されているかどうか(その状態)をチェックします。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CCheckGroup::itemCheckState(const string item) {
  int total = m_strings.Total();
  
  if(total != m_states.Total())
    return -1;
    
  int i = 0;
  for(; i < total; i++) {
    if(m_strings.At(i) == item)
      return m_states.At(i);
  }
  
  return -1;
}

結局、こういうUIになりました。

ユーアイ

UI要素の一部を仮区分しています。そして、CAppDialog要素のShow()とHide()メソッドをオーバーロードした方法を説明したブランチはこちらです。https://www.mql5.com/ru/forum/338301。その瞬間、コンパイラが文句を言い、クリティカルエラーが発生した。

最終的にプロジェクトは正常にコンパイルされ、コンパイラは何のエラーも発生させません。しかし、デバッグは失敗し、いくつかのコードフラグメント、関数、メソッドなどの実行を表示しないだけです。

私が理解する限り、その理由はいくつかありそうです。

  1. プロジェクトの複雑なコード、マクロの使用
  2. CAppDialog, CCheckGroup, CComboBox, CButton などの標準的な UI 要素を使った複雑なコード(これらのメソッドも新しく書き、既存のメソッドの一部を再定義しました。)
  3. 新しいビルドに関連したデバッガーのバグ(可能性あり、可能性なし)。

ビルドとシステム情報。

2020.05.21 09:35:09.325 Terminal MetaTrader 5 x64 build 2433 started for MetaQuotes Software Corp.

2020.05.21 09:35:09.326 Terminal Windows 10 build 14393, Intel Core i5-5200U @ 2.20GHz, 2 / 3 Gb メモリ, 61 / 380 Gb ディスク, IE 11, UAC, GMT+2

デバッガで同様の問題が発生した方、その原因は何でしょうか?
 
fxsaber:

このことから、オプティマイザーの効率を上げるには、SymbolInfo関数の文字列参照ソリューションが最適であることは明らかである。

どうせ全部参照渡しなんだから。 違いは古代のMQL4だけだった。また、文字列を読み込む際のチェックはありません。
 
Alexey Navoykov:
このリンクは意味がない、開発者がそう言った。 全てはそのままリンクで渡される。 唯一の違いは古代のMQL4であった。また、文字列を読み込む際のチェックはありません。

そういう発言をするのは疲れるだけです。

int f1( string Str )
{
  return((Str += Str) == Str);
}

int f2( string &Str )
{
  return((Str += Str) == Str);
}

int Bench1( const int Amount = 1 e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f1(Str);
    
  Print(Res);
    
  return(Res);    
}

int Bench2( const int Amount = 1 e8 )
{
  int Res = 0;
  string Str = NULL;
  
  for (int i = 0; i < Amount; i++)
    Res += f2(Str);

  Print(Res);
    
  return(Res);    
}

void OnStart()
{
  BENCH(Bench1())
  BENCH(Bench2())

  BENCH(Bench1())
  BENCH(Bench2())
}


        100000000
        Time[Bench1()] = 727585
        100000000
        Time[Bench2()] = 657464
        100000000
        Time[Bench1()] = 794205
        100000000
        Time[Bench2()] = 670440
 
fxsaber:

そういう発言は疲れるだけです。


書きやすいのかもしれませんね。

int f1( string Str )
{
  return(Str == NULL || Str == "");
}

?...

なぜそんなものを飲むのか?

int f1( string Str )
{
  return((Str += Str) == Str);
}
 
Mihail Matkovskij:

書きやすいかもしれません。

違う種類の議論もある。

 
fxsaber:

そういう発言をするのは疲れるだけです。

根拠がないことにならないように、文字列が変化 しないベンチマークをあげてください。
 
TheXpert:
根拠がないことにならないように、文字列が変化 しないテストのベンチマークをあげてください。
int f1( const string Str )
{
  return(Str + "1" != Str);
}

int f2( const string &Str )
{
  return(Str + "1" != Str);
}
        10000000
        Time[Bench1()] = 334596
        10000000
        Time[Bench2()] = 338559
        10000000
        Time[Bench1()] = 384711
        10000000
        Time[Bench2()] = 344346