Получаем количество десятичных знаков после запятой любых чисел (не только котировок) в обход Digits() на MQL4 и MQL5 - страница 16

 

Вот ещё интересная задача: сделать функцию сортировки массива более быструю, чем встроенный ArraySort. 

 
Ilya Malev:
sizeof(S)/sizeof(T)

А что, размеры всех структур гарантированное делятся на размеры всех переменных? 

struct SZ{
   char x1;
   char x2;
   char x3;   
};

Print(sizeof(SZ)/sizeof(int)); // 0
 
fxsaber:

Могу ли я направить мозговой штурм на быструю реализацию перевода массива структур (длина кратна sizeof(int)) в массив int[] и обратно?

///

Просто после описания структуры пишем еще несколько строк с объединением, включающим эту структуру и массив.

struct SS{
   int a;
   double b;
};

union UX{
   SS s;
   char a[sizeof(S)];
};


Можно даже не писать после каждой структуры, а зашаблонить - кому как удобней. 

 
Dmitry Fedoseev:

А что, размеры всех структур гарантированное делятся на размеры всех переменных? 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Получаем количество десятичных знаков после запятой любых чисел (не только котировок) в обход Digits() на MQL4 и MQL5

fxsaber, 2018.12.07 15:12

Могу ли я направить мозговой штурм на быструю реализацию перевода массива структур (длина кратна sizeof(int)) в массив int[] и обратно?

В общем случае решение лежит по этой же ссылке, но из-за универсальности там тормоза. Поэтому кратность - вполне объяснимое доп. условие.

Еще это появилось

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

MetaQuotes Software Corp., 2018.10.25 17:18

  1. MQL5: Для структур добавлено свойство pack( integer_value ). Оно позволяет задать выравнивание расположения полей внутри структуры, это бывает необходимо при работе с DLL. Для integer_value возможны значения 1, 2, 4, 8 и 16.
    Если свойство не определено, по умолчанию используется вырванивание в 1 байт — pack(1).

    Пример использования:
    //+------------------------------------------------------------------+
    //| Default packing                                                  |
    //+------------------------------------------------------------------+
    struct A
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| Specified packing                                                |
    //+------------------------------------------------------------------+
    struct B pack(4)
      {
       char              a;
       int               b;
      };
    //+------------------------------------------------------------------+
    //| Script program start function                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print("sizeof(A)=",sizeof(A));
       Print("sizeof(B)=",sizeof(B));
      }
    //+------------------------------------------------------------------+
    Вывод:
    sizeof(A)=5
    sizeof(B)=8
    Более подробная информация о выравнивании в структурах доступно в MSDN.
 
Dmitry Fedoseev:

Просто после описания структуры пишем еще несколько строк с объединением, включающим эту структуру и массив.

Можно даже не писать после каждой структуры, а зашаблонить - кому как удобней. 

Не понял. Если есть желание поучаствовать, напишите свой вариант, пожалуйста.

 
fxsaber:

Могу ли я направить мозговой штурм на быструю реализацию перевода массива структур (длина кратна sizeof(int)) в массив int[] и обратно?

а почему в инт? а не в чар?

(и лонг длиннее будет - быстрее скопируется)

 
Ilya Malev:

Видимо, у Вас уже быстрее :)

// Перевод массива тиков в массив int[].
int TicksToIntArray_fxsaber3( const MqlTick &Ticks[], int &Array[] )
{
  INTEGER<MqlTick> TickInteger;

  const int Size = ArraySize(Ticks);
  ArrayResize(Array, Size * sizeof(MqlTick) / sizeof(int));
  
  int j = 0;

  for (int i = 0; i < Size; i++)
  {
    TickInteger.Data = Ticks[i];

//    j += ArrayCopy(Array, TickInteger.Integer, j);
    for (int k = 0; k < sizeof(MqlTick) / sizeof(int); k++)
      Array[j++] = TickInteger.Integer[k];
  }

  return(j);
}

// Перевод массива int[] в массив тиков.
int IntArrayToTicks_fxsaber3( const int &Array[], MqlTick &Ticks[] )
{
  INTEGER<MqlTick> TickInteger = {0};

  const int Size = ArraySize(Array);
  ArrayResize(Ticks, Size * sizeof(int) / sizeof(MqlTick));
  
  int j = 0;

  for (int i = 0; i < Size; j++)
  {
//    i += ArrayCopy(TickInteger.Integer, Array, 0, i, sizeof(MqlTick) / sizeof(int));
    for (int k = 0; k < sizeof(MqlTick) / sizeof(int); k++)
      TickInteger.Integer[k] = Array[i++];

    Ticks[j] = TickInteger.Data;
  }

  return(j);
}


Попробую значительно ускорить.

 
fxsaber:

Не понял. Если есть желание поучаствовать, напишите свой вариант, пожалуйста.

Так написал же. 

 
fxsaber:

В общем случае решение лежит по этой же ссылке, но из-за универсальности там тормоза. Поэтому кратность - вполне объяснимое доп. условие.

Еще это появилось

Кто будет контролировать эту кратность? 

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