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

 
Andrei Trukhanovich :

なぜなら、テンプレートは出力値ではなく、パラメータによってのみ型を出力するからです。

これは正確ではありません。

struct A
  {
   int               i;
   double            d;
  };

template<typename T>
T f(int value)
  {
   T result={0};
   return(result);
  }
//+------------------------------------------------------------------+
void OnStart()
  {
   A a;
   int i = 1;
   a = f<A>(i);
  }
 
Alain Verleyen:

それは正確ではありません。

ありがとうございました。

はい、動作します、構文が混乱しました

ZS:意図したとおりにすべて動作するようになりました。

struct A
  {
   long              l;
   uint              ui;
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   A a;
   uchar u_arr[];
   string result = "";
   a.l  = 0xFFFFFFFFFFFFFFFF;
   a.ui = 0x0000;
//--- проверка работоспособности вывода
   StructToCharArray(a, u_arr);
   for(int i = 0; i < ArraySize(u_arr); i++)
     {
      result += StringFormat("%x", u_arr[i]);
     }
   printf("result = %s", result);   // result = ffffffffffffffff0000

//----  
   string s = StructEncodeBase64(a);
   Print(s);
   A b;
   b = StructDecodeBase64<A>(s);

   StructToCharArray(b, u_arr);
   result="";
   for(int i = 0; i < ArraySize(u_arr); i++)
     {
      result += StringFormat("%x", u_arr[i]);
     }
    printf("result = %s", result);

  }
//+------------------------------------------------------------------+
template<typename T>
string StructEncodeBase64(T &s_value)
  {
   const uchar key[1] = {0};
   uchar data[], result[];
   StructToCharArray(s_value, data);
   CryptEncode(CRYPT_BASE64, data, key, result);
   return(CharArrayToString(result));
  }
//+------------------------------------------------------------------+
template<typename T>
T StructDecodeBase64(string value)
  {
   const uchar key[1] = {0};
   uchar data[], decode[];
   T result;
   StringToCharArray(value, data, 0, StringLen(value));
   CryptDecode(CRYPT_BASE64, data, key, decode);
   CharArrayToStruct(result, decode);
   return(result);
  }
POD構造体のBase64シリアライズ
 
Alain Verleyen:

それは定かではありません。

いいえ、そんなことはありません。関数内のテンプレートパラメータの型を明示的に設定 することを指摘されましたが、私は出力について話して いたのですが、明示的な設定については、fxsaberさんが先に答えてくれました。

 
Andrei Trukhanovich :

いいえ、その通りです。関数内のテンプレートパラメータの型を明示的に設定 することを指摘されましたが、私は出力について話して いたのですが、明示的な設定については、fxsaberさんが先に答えてくれました。

言語の問題。
 

フォーラムやドキュメントで見つけられなかったので、質問させてください。

1.MQL5が格納できる文字列の最大サイズはどのくらいですか?

2.MQL4が格納できる文字列の最大サイズは?

3.メモリ不足 の場合、この最大サイズは縮小されるのか(あるいは文字列のためのメモリが確保されない)、あるいはランタイムエラーが発生するのか?

 

欠陥がある。
( MT5(ビルド2319)では未修正) テンプレートクラスのキャッシュ操作のバグ:「内部型 "C "の複雑なラップオブジェクトを何度も作成し、それが全く異なるデータ型であることが判明した、たぶん "B"、"int"、あなたが望むものは何でも...」と。
( MT5(build2319)では未修正) 内部クラス使用時のテンプレートクラスコード生成の不具合を修正しました。
(not fixed MT5(build 2319)) 内部クラス定義時のバグ - ベースクラス指定時にグローバルネームスペースを明示的に参照することができない。


提案します。
ref- MQLにtypedef宣言機能を導入する必要性について。
リファレンス- デフォルトのコピーコンストラクタと代入演算子を強制的に生成できるようにするためのものです。

 
Sergey Dzyublik:

欠陥がある。

バグレポートを記録するのは良いことだ。そうじゃなかったから、フォーラムですべてが取り返しのつかないことになったんだ。

バグレポートの投稿に同じハッシュレコードをいくつか追加して、一括で検索できるようにするといいかも。

 
Igor Makanu:

フォーラムやドックで見つけられなかったので、質問させてください。

1.MQL5が格納できる文字列の最大サイズはどのくらいですか?

2.MQL4が格納できる文字列の最大サイズは?

3.メモリ 不足の場合、この最大サイズは縮小されるか(あるいは文字列用のメモリが確保されない)、ランタイムエラーが発生するか?

MT4で文字列をテストしてみた

void OnTick()
  {
   static bool frun = true;
   uchar u_arr[102400];
   if(frun)
     {
      frun = false;
      string s = "";
      while(!IsStopped())
        {
         ArrayInitialize(u_arr, uchar(rand() % 255));
         s += CharArrayToString(u_arr);
         printf("StringLen = %i , m_physical = %i, m_total = %i, m_available = %i, m_used = %i", StringLen(s), TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL), TerminalInfoInteger(TERMINAL_MEMORY_TOTAL),
                TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE), TerminalInfoInteger(TERMINAL_MEMORY_USED));
         Sleep(150);
        }
     }
  }
//+------------------------------------------------------------------+

ログにあるMT4で、メモリがゆっくりリークする(11.9のうち5.1)。

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_available = 3365, m_used = 729


一般的に、賢明なタスクでは、大きな文字列を使用することができます、多分私は後でチェックするために文字列を介してファイルをコピーします。

UPD:処理を高速化するために、uchar u_arr[102400]; をucharu_arr[524224]; に置き換えた。

結論:MT4では、文字列を入れることができるおおよその上限は

2020.02.13 21:11:24.177 tst_string EURUSD,H1: out of memory

2020.02.13 21:11:24.024 tst_string EURUSD,H1: StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_available = 2556, m_used = 1539.


すなわち、約640MB

SZZ:MT5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_available = 21975, m_used = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) 'tst_string.mq5' でメモリ不足 (41,12)になっています。

すなわち、1GB程度
 
Igor Makanu :

MT4で文字列をテストしてみた

Win Managerで少しメモリが漏れている(11.9のうち5.1)、MT4ではログで漏れている。

StringLen = 221696000 , m_physical = 12157, m_total = 4095, m_available = 3365, m_used = 729


一般的に、賢明なタスクでは、大きな文字列を使用することができます、多分私は後でチェックするために文字列を介してファイルをコピーします。

UPD:処理を高速化するために、uchar u_arr[ 102400 ]; を ucharu_arr[524224]; に置き換えた。

結論:MT4では、文字列に入れることができるおおよその上限は

2020.02.13 21:11:24.177 tst_string EURUSD,H1: out of memory

2020.02.13 21:11:24.024 tst_string EURUSD,H1: StringLen = 640601728 , m_physical = 12157, m_total = 4095, m_available = 2556, m_used = 1539.


すなわち、約640MB

SZZ:MT5

2020.02.13 21:56:12.964 tst_string (EURUSD,H1) StringLen = 1073610752 , m_physical = 12157, m_total = 24314, m_available = 21975, m_used = 2339

2020.02.13 21:56:13.140 tst_string (EURUSD,H1) 'tst_string.mq5' でメモリ不足 (41,12)になっています。

すなわち、1GB 程度

これはUnicodeの文字列長 なので、MBでは最低でも2倍となる。MT4では1.3GB。連続したメモリバッファが必要で、MT4は32ビットアプリケーションなので、これは理にかなっています。つまり、mql4の制限自体はなく、利用可能なメモリによってのみ制限されるのです。

利用可能なメモリが多いようなので、MT5がもっと許可しないのはちょっと驚きです。私の方でも頑張ります。

 
Alain Verleyen:

これはUnicodeの文字列長 なので、MBでは最低でも2倍になります。MT4では1.3GB。連続したメモリバッファが必要で、MT4は32ビットアプリケーションなので、これは理にかなっています。つまり、mql4自体の制限ではなく、利用可能なメモリによって制限されるだけなのです。

利用可能なメモリが多いようなので、MT5がもっと許可しないのはちょっと驚きです。私の方でも頑張ります。

メモリは12GB、Windows 10、空きメモリは約8GBです。


mt4/mt5ターミナルで許容される最大の線の長さを知るために、このテストが必要でした。

Redisデータベースを介して端末間のやり取りを行いたい

Redisは非常にシンプルなデータベースで、文字列(キー - 値 --> strin - 文字列)のみで動作します。

昨日、POD構造体をBase64でシリアライズしたところ、データサイズが約1/3になりました。

この場合でも、1回の取引で400Mbのサイズの構造体を交換できる可能性があり、どんな目的にも十分すぎるほどです! ;)