Ошибки, баги, вопросы - страница 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:

Это не точно.

Спасибо!

Да, будет работать, в синтаксисе запутался

ЗЫ: все как задумано теперь работает:

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. какой максимальный размер string может хранить MQL5

2. какой максимальный размер string может хранить MQL4

3. если будет нехватка памяти этот максимальный размер будет уменьшен (или будет не выделена память для string) или будет runtime error ?

 

Дефекты:
(не исправлено MT5(build 2319)) баг в работе кеша шаблонного класса: "Создаешь сложный несколько раз обернутый объект с внутренним типом "С", а там оказывается совсем другой тип данных, может "B", может "int", что хочешь...".
(не исправлено MT5(build 2319)) баг с генерацией кода шаблонного класса при использовании internal class.
(не исправлено MT5(build 2319)) баг при определении internal class - отсутствует возможность явно сослаться на глобальное пространство имен при указании базового класса.


Предложения:
ссылка - о необходимости введения в MQL typedef declaration функциональности.
ссылка - о предоставлении возможности принудительной генерации дефолтных конструкторов копирования и операторов присвоения.

 
Sergey Dzyublik:

Дефекты:

Хорошо, что отслеживаете свои баг-репорты. Я так не делал, от того все безвозвратно затерялось на форуме.

Наверное, нужно в посты со своими баг-репортами добавлять какую-нибудь одну и ту же хэш-запись, чтобы поиском можно было разом их все вместе находить.

 
Igor Makanu:

поиском по форуму и докам не нашел, вопрос назрел:

1. какой максимальный размер string может хранить MQL5

2. какой максимальный размер string может хранить MQL4

3. если будет нехватка памяти этот максимальный размер будет уменьшен (или будет не выделена память для string) или будет runtime error ?

попробовал потестировать string в МТ4

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);
        }
     }
  }
//+------------------------------------------------------------------+

в диспетчере Вин память по не многу течет (5,1 из 11,9) , в МТ4 в логе:

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


в целом, для разумных задач можно большие string использовать, может чуть позже файл через string скопирую проверю

UPD: заменил uchar u_arr[102400]; на  uchar u_arr[524224]; чтобы ускорить процесс

итог: в МТ4 примерный максимум, что можно положить в string это:

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


т.е. около 640 Мб

ЗЫ: МТ5

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)

т.е. около 1Гб
 
Igor Makanu :

попробовал потестировать string в МТ4

в диспетчере Вин память по не многу течет (5,1 из 11,9) , в МТ4 в логе:

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


в целом, для разумных задач можно большие string использовать, может чуть позже файл через string скопирую проверю

UPD: заменил  uchar u_arr[ 102400 ]; на  uchar u_arr[524224]; чтобы ускорить процесс

итог: в МТ4 примерный максимум, что можно положить в string это:

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


т.е. около 640 Мб

ЗЫ: МТ5

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)

т.е. около 1Гб

Это длина строки для Unicode, поэтому в МБ это как минимум double. 1,3 Гб для MT4, что имеет смысл, так как вам нужен непрерывный буфер памяти, а MT4 - 32-битное приложение. Таким образом, ограничение mql4 само по себе не является ограничением, а ограничено только доступной памятью.

Я немного удивлен, что MT5 не позволяет больше, так как кажется, что у вас много доступной памяти. Я буду стараться на моей стороне.

 
Alain Verleyen:

Это длина строки для Unicode, поэтому в МБ это как минимум double. 1,3 Гб для MT4, что имеет смысл, так как вам нужен непрерывный буфер памяти, а MT4 - 32-битное приложение. Таким образом, ограничение mql4 само по себе не является ограничением, а ограничено только доступной памятью.

Я немного удивлен, что MT5 не позволяет больше, так как кажется, что у вас много доступной памяти. Я буду стараться на моей стороне.

у меня памяти 12 Гб, ОС Windows 10 , свободной памяти около 8 Гб


этот тест мне нужен был, чтобы определить максимально допустимые длины строк в терминалах МТ4/МТ5

я сейчас хочу наладить обмен между терминалами через базу данных Redis 

Redis очень простая база данных и работает исключительно со строками (ключ - значение  --> strin - string)

вчера я сделал сериализацию POD-структур в Base64, при этом размер данных увеличивается примерно на 1/3 

я считаю, что даже в этом случае у меня есть возможность обмениваться структурами с размером по 400 Мб за одну транзакцию - это более чем достаточно для любых целей!  ;)

Причина обращения: