错误、漏洞、问题 - 页 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(build 2319)没有修复)模板类缓存操作中的错误:"你用内部类型 "C "创建了复杂的封装对象,几次后发现它是相当不同的数据类型,也许是 "B",也许是 "int",随你怎么想..."。
(未 被MT5(build 2319)修复)使用内部类时模板类代码生成的错误。
(未修复 MT5(build 2319))定义内部类时的错误--在指定基类时无法明确引用全局命名空间。


建议。
ref- 关于需要在MQL中引入类型定义声明功能。
参考- 允许强制生成默认的复制构造函数和赋值运算符。

 
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


一般来说,对于合理的任务,你可以使用大的字符串,也许以后我会通过一个字符串复制文件来检查

更新: uchar u_ arr [ 524224] 代替uchar u_arr[102400 ];,以加快处理速度

一句话:在MT4中,可以放入字符串的近似最大值是。

2020.02.13 21:11:24.177 tst_string EURUSD,H1: 内存耗尽

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) out of memory in '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


一般来说,对于合理的任务,你可以使用大的字符串,也许以后我会通过一个字符串复制文件来检查

更新: uchar u_arr[524224] 代替uchar u_arr[ 102400];,以加快处理速度

一句话:在MT4中,可以放入字符串的近似最大值是。

2020.02.13 21:11:24.177 tst_string EURUSD,H1: 内存耗尽

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) out of memory in 'tst_string.mq5' (41,12)

即约1GB

这是Unicode的字符串长度,所以以MB为单位,它至少是两倍。MT4为1.3GB,这是有道理的,因为你需要一个连续的内存缓冲区,而MT4是一个32位的应用程序。因此,mql4的限制本身并不是一种限制,而只是受到可用内存的限制。

我有点惊讶MT5不允许更多,因为看起来你有很多可用的内存。我这边会尽力而为。

 
Alain Verleyen:

这是Unicode的字符串长度,所以在MB中,它至少是两倍。MT4为1.3GB,这是有道理的,因为你需要一个连续的内存缓冲区,而MT4是一个32位的应用程序。所以mql4本身的限制并不是一个限制,它只是受限于可用的内存。

我有点惊讶MT5不允许更多,因为看起来你有很多可用的内存。我这边会尽力而为。

我有12gb的内存,Windows 10,可用内存约8gb。


我需要这个测试来找出mt4/mt5终端中允许的最大线长

我现在想通过Redis数据库在终端之间进行交换

Redis是一个非常简单的数据库,只对字符串工作(key - value --> strin - string)。

昨天我用Base64序列化了POD结构,它使数据大小增加了约1/3。

我认为,即使在这种情况下,我也有可能交换每笔交易大小为400Mb的结构--这对任何目的来说都是绰绰有余的!;)