Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях - страница 58

 
mktr8591 #:

Обратил внимание на изменение поведения программ при делении на 0 целых чисел в последних билдах - ошибка с вылетом программы возникает не в месте деления, а там, где впервые используется результат деления:

Если обернуть деление в функцию, результат тот же.

Видимо, это оптимизация....

Ленивые вычисления, переходим на хаскель)

 

b3062

При компиляции по F7 скрипт работает нормально, при F5 вылетает с ошибкой "Integer overflow"

void OnStart()
  {
   int i = INT_MIN;
   long l = -1;
   long result = i / l;

   Print(result);    //2147483648
  }

Вроде бы здесь нет переполнения.

 
void OnStart()
  {
   uint           arr[8];
   ArrayInitialize(arr,UINT_MAX);
  }
truncation of constant value    test2.mq5       13      24

Зачем тут ругаться?

 

Поправьте, пожалуйста. Не видит union

 

Ну ладно...

Выделенное не правильно считает, часть не понимает, часть правильно

 

Шестнадцатеричное представление числа переменной ll ?

Так уж и быть, калькулятором буду пользоваться

 

Время выполнения скрипта под отладкой:  178.341 мс

Время выполнения релизной версии скрипта: 13415.898 мс

Релизная версия значительно медленнее отладочной!

//+------------------------------------------------------------------+
//|                                                        cBool.mqh |
//|                                               Aliaksandr Hryshyn |
//|                          https://www.mql5.com/ru/users/greshnik1 |
//+------------------------------------------------------------------+
#property copyright "Aliaksandr Hryshyn"
#property link      "https://www.mql5.com/ru/users/greshnik1"

//Битовый поток
class cBit_thread
  {
private:
   ulong             _bit_thread[];//Битовый поток данных
   uint              _bit_thread_size;//Количество записанных бит в потоке
   uint              _bit_thread_pos;//Текущя позиция для чтения/записи
public:
   //Запись последовательности бит
   //Размер увеличивается динамически
   template<typename T>
   int               Write(
      const T value,//Простая структура или переменная
      uint pos_bit_read=0,//С какой позиции начать считывание из структуры/переменной.Указывается в битах
      int bits_count=-1//Количество бит. -1=все до конца
   );//Возвращает количество записанных бит -1=ошибка
  };

template<typename T>
int cBit_thread::Write(const T value,uint pos_bit_read=0,int bits_count=-1)
  {
   union u_Data_t
     {
      T value;
      ulong data[sizeof(T)/8+1];
     } data_t;
   ZeroMemory(data_t.data);
   data_t.value=value;

   if(pos_bit_read>=sizeof(T)*8)
      return -1;
   if(bits_count<0)
      bits_count=int(sizeof(T)*8-pos_bit_read);
   else
      if(pos_bit_read+bits_count>sizeof(T)*8)
         return -1;

   uint shift=int(pos_bit_read&63);
   int read_from=int(pos_bit_read>>6);

   int read_end=int(pos_bit_read+bits_count);
   uint write_to=0;
   ulong l1=0;
   for(int i1=read_from; i1<(read_end>>6)+1; i1++,write_to++)
     {
      l1=data_t.data[i1];
      data_t.data[write_to]=l1>>shift;
      if(write_to>0)
         data_t.data[write_to-1]|=l1<<(64-shift);
     }

   uint len1=ArrayRange(_bit_thread,0);
   uint len2b=_bit_thread_pos+bits_count;
   if(len2b+128>(len1<<6))
     {
      len2b=(len2b>>6)+2;
      ArrayResize(_bit_thread,len2b+1024);
      len2b+=1024;
      for(uint i1=len1; i1<len2b; i1++)
         _bit_thread[i1]=0;
     }
   int pos_end=(bits_count>>6)+((bits_count&63)!=0);
   shift=_bit_thread_pos&63;
   write_to=(_bit_thread_pos>>6);
   if(shift==0)
     {
      for(int i1=0; i1<pos_end; i1++)
        {
         l1=data_t.data[i1];
         _bit_thread[write_to]|=l1;
        }
     }
   else
     {
      for(int i1=0; i1<pos_end; i1++)
        {
         l1=data_t.data[i1];
         _bit_thread[write_to]|=(l1<<shift);
         _bit_thread[write_to+1]|=l1>>(64-shift);
        }
     }
   _bit_thread_pos+=bits_count;
   _bit_thread_size=MathMax(_bit_thread_size,_bit_thread_pos);
   return bits_count;
  }
//+------------------------------------------------------------------+

И скрипт:

#include <cBool.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   cBit_thread thread;
   ulong mcs=GetMicrosecondCount();
   int num=1;
   for(int i1=0; i1<10*1024*1024; i1++)
     {
      thread.Write(num,0,1);
     }
   Print((GetMicrosecondCount()-mcs)/1000.0);
  }
Объявление переменной data_t как static решает вопрос.
 
Всё это на последней бетта-версии.
 

Думаю, что людям не обязательно знать что они написали кому-то сообщение :)))

Вылезает единица при исходящем сообщении

 
mktr8591 #:

Мой "рабочий" терминал был подключен в MQL Storage, второй, с бета-версией, не был. Сегодня изменил пароль от mql5.com и попробовал подключить ко второму терминалу Storage.

Результаты с новым паролем:

1. Терминал №1 (релиз b2981): OK

   ME - "Storage    invalid MQL5 login or password" (как я понимаю, пароль слишком длинный для старой версии)

2. В storage.mql5.io захожу без ошибок, вижу свои файлы.

3. Терминал №2(beta b3062): MQL community также работает OK.

    ME - сразу при входе в журнале ошибка "Storage    projects list request failed with error 1001"

          в контекстном меню Навигатора выбираю "Подключить MQL5 Storage" - в журнале ошибка  "Storage    activation of MQL5 Storage failed [1001]"

Почему второй терминал не подключается? Что я не так делаю?

(Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M  @ 2.50GHz)

Обновился до b3063 - те же ошибки (код 1001).