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

 

以下の質問について、どなたかご教示いただけないでしょうか。

C#で書かれたDLLがあるが、コンパイルされている。

- MT5通常のC#プロジェクト用 - Net Framework dll - 64ビット

- MT4 - Net Framework dll - 32ビットですが、マネージドCコールに包まれています。

ソースDLは、もちろんMT4ラッパーを除いて100%同一です。

OS Win10-64

さて、問題は、なぜMT4は正確に4倍速く機能を呼び出す のか、数値は、MT4で7.5秒、MT5で30秒の約100 000 dllの呼び出しです

 
Igor Makanu:

以下の質問について、どなたかご教示いただけないでしょうか。

C#で書かれたDLLがあるが、コンパイルされている。

- MT5通常のC#プロジェクト用 - Net Framework dll - 64ビット

- MT4 - Net Framework dll - 32ビットですが、マネージドCコールに包まれています。

ソースDLは、もちろんMT4ラッパーを除いて100%同一です。

OS Win10-64

さて、問題は、なぜMT4は正確に4倍速く機能を呼び出す のか、数値は、MT4で7.5秒、MT5で30秒の約100 000 dllの呼び出しです

IMHO一方はCランタイム、もう一方は仮想マシン。

 
1 2 3 、誰もが持っていない、昨日、私は私が持っていなかったと思う、なぜすべてではない、そして、ページの定義は何ですか?
 

Expert Advisorには、グラフィカルなインターフェースが実装されています。ユーザーイベントも 実装されています(GUI変更イベントなど)。実データでデバッグを行う(F5)。ユーザーイベントにブレークポイントを置くとすぐにデバッガが停止しますが、その後F5を押しても(デバッグを継続)、GUI自体の変更にはつながりません。質問:これは、デバッガーのバグであるべきなのでしょうか?

ブレークポイントを外すと(デバッグは継続)-GUIの変化が正常に行われます。

MT5、ビルド2340。

 
Vladimir Simakov:

IMHO一方はCランタイム、もう一方は仮想マシン。

両方のDLLに仮想の.Netがあります。

私はコードの違いを発見し、32ビットのベースクラスを別スレッドに投げました。

MT5でも同じ操作をしてみましたが、結果はほぼ同じです(各3回テスト)。

MT5: サイクル 100000 , 時間 8.482981 秒 , サイクル 100000 , 時間 8.638789 秒 , サイクル 100000 , 時間 8.390046 秒

MT4:サイクル100000 、時間7.128857秒 、サイクル100000 、時間7.176361秒 、サイクル100000 、時間7.205439秒


OK、マイクロソフトのある種のフーゾクだと仮定しよう
 

ごあいさつすべての男性にハッピーホリデーを !!!!
テスターでエクイティがジグザグに表示される不思議なバグは何なのか理解できていない。 テスターで株式表示がジグザグになる不思議なバグが理解できない。決済方法」の設定を「株式交換」から「FX」に変更すると、株式が正常に表示されるようになりました。私も数年前、MT5をファンドにつないでみようと思い、テストして、怖くなってあきらめた経験があります。今、もう一度試してみたが、同じだった。おかしいですか?

 
なぜ、L値、R値、リテラル、一時変数といった「出自」に関係なく、どんな変数でも渡すことができる「万能」な引数を持つ関数を実装できないのでしょうか?
この問題は、「型付き」コンテナ・クラスのメソッドについては解決可能だが、通常の関数については解決できない。

主な矛盾点は、構造体の転送には参照転送を、リテラルや一時変数には値による転送を使う必要があることです。
その結果、通常のlvalue型では、両方のオーバーロードされた関数が呼び出しに適しているため、コンパイルエラーが発生します。
部分的な解決策として、「プリミティブ」な型に対してのみ、12個のオーバーロードされた関数を作ることができます。
#define  CREATE_LITERAL_PARAMETER_CALL_HANDLERS_VOID_T1_P2_L2(current_func_name, main_func_name, param_1)          \
   template<typename T> void current_func_name(param_1 p1, const string  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const long    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const int     value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const short   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const char    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ulong   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uint    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ushort  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uchar   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const double  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const float   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const bool    value){ main_func_name(p1, value);}    
しかし、ある関数が2つの「普遍的な」引数を受け取る場合、その実装には144個のオーバーロード関数しか必要ないが、そのような引数が3つの場合は、全体で1728個のオーバーロード関数が必要となる。


提案します。
最後に、リテラルと一時変数を const ref関数の引数として 渡すことができるようになりました。
別の#ディレクティブにしましょう - 何でもいいですから...。
 

テンプレート機能/クラスキャッシュの動作に不具合があります。
( MT5(ビルド2340)では修正 されていません)** 未定義の動作:内部型 "C "の複雑なラップオブジェクトを何度か作成し、それが全く別のデータ型、多分 "B"、多分 "int"、何でもいいのですが、判明した場合...
( MT5(ビルド2340)では修正 されていません)* コンパイルエラー、const ref テンプレート引数として関数ポインタを渡す際のバグ。
( MT5(build 2340)では修正 されていません) * コンパイルエラー、B<int>オブジェクトはB<void*>クラスオブジェクトの後に作成できますが、その前に行うとコンパイルエラーが発生します。


テンプレート機能/クラスワークの不具合。
( MT5(ビルド2340)では修正 されていません)** コンパイルエラー、テンプレート関数内のバグ、明示的な型変換 操作で渡されたポインタは、クラスのように動作し、それ以外の場合はポインタのように動作します。
( MT5(ビルド2340)では修正 されていません)** コンパイルエラー、内部クラス使用時のテンプレートクラスコード生成の不具合。
( MT5(ビルド2340)では修正 されていません)** テンプレート関数のテンプレートパラメータで内部クラスにアクセスしようとすると、コンパイルエラーになります。
( MT5(ビルド2340)では修正 されていません)** コンパイルエラー、テンプレートメソッド/クラス生成時のバグ、テンプレートパラメータの「自動置換」処理がスコープ外からメインプログラムコードに入る。
( MT5(ビルド2340)では修正 されていません)* コンパイルエラー、テンプレートクラスがテンプレートメソッドの戻り値として動作する場合、コードが自動生成されない不具合。
( MT5(ビルド2340)では修正 されていません)* コンパイルエラー、内部クラス定義のバグ - ベースクラスを指定する際に、グローバルネームスペースを明示的に参照する可能性がない。


オーバーロードされた関数呼び出しの不具合 C++と比べたMQLの優先順位の不一致。
( MT5(ビルド2340)では修正 されていません)*** A <= B <= C <= D というクラス継承があり、A* と B* というパラメータを持つオーバーロード関数が実装されている場合、MQL でその関数にオブジェクト C* または D* を渡すと、コンパイルエラー "ambiguous call to overloaded function" を発生します。
( MT5(ビルド2340)では修正 されていません)** ランタイム、オーバーロードされたテンプレート関数呼び出しの優先順位が不一致です。



提案します。
link- リテラルと一時的な変数を const ref 関数の引数として渡すことができるようになりました。
link- プロジェクトタブでプロジェクトファイルを移動 するとき、MEタブで開いている移動したファイルについて、その場所のパスを自動的に更新するようにしました。
link- MQLにtypedef宣言機能を導入する。
link- デフォルトのコピーコンストラクタと代入演算子を強制的に生成できるようにすることについて。


 

助けを求めているんだ、私は完全に蚊帳の外なんだ。

OnChartEventで、`C`を押すと、価格チャートをキャンセル/復元します。

そして、すべてがうまくいくだろうが、キーボードレイアウトが英語を選択されていない場合 - 動作しません。


C`を押したときの検出を、選択されたレイアウトに依存しないようにするにはどうしたらよいでしょうか?

 
fxsaber:

助けを求めているんだ、私は完全に蚊帳の外なんだ。

OnChartEventで、`C`を押すと、価格チャートをキャンセル/復元します。

そして、すべてがうまくいくだろうが、キーボードレイアウトが英語を選択されていない場合 - 動作しません。


Cボタンを押したときの検出を、選択されているレイアウトに依存しないようにするには?

lparamの チェックが必要

//+------------------------------------------------------------------+
//|                                                 TranslateKey.mq5 |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
     {
      short sym=TranslateKey((int)lparam);
      //--- if the entered character is successfully converted to Unicode
      if(sym>0)
         Print("lparam: ",lparam,", ",sym,"'",ShortToString(sym),"'");
      else
         Print("Error in TranslateKey for key=",lparam);
     }
  }
//+------------------------------------------------------------------+

キーボードレイアウトがruとenの場合(小文字と大文字の両方)、lparamは67になります。

TranslateKey (EURUSD,H1)        lparam: 67, 67'C'
TranslateKey (EURUSD,H1)        lparam: 67, 1057'С'
TranslateKey (EURUSD,H1)        Error in TranslateKey for key=20
TranslateKey (EURUSD,H1)        lparam: 67, 1089'с'
TranslateKey (EURUSD,H1)        lparam: 67, 99'c'