绕过MQL4和MQL5中的Digits(),获取任何数字的小数位数(不仅仅是引号)。 - 页 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[]数组,并从int[]数组中转换 出来吗?

///

只需在描述完一个结构后,再写几行包括这个结构和一个数组的联盟。

struct SS{
   int a;
   double b;
};

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


甚至可以不在每个结构后面写,而是以模板形式写--不管你怎么方便。

 
Dmitry Fedoseev:

所有结构的大小是否保证除以所有变量的大小?

关于交易、自动交易系统和策略测试的论坛

在MQL4和MQL5中绕过Digits()获得任何数字的小数位数(不仅仅是引号)。

fxsaber, 2018.12.07 15:12

我可以集思广益,快速实现将一个结构数组(长度为sizeof(int)的倍数)转换为int[]数组,或者从int[]数组中转换出来吗?

一般来说,解决方案在同一环节,但由于多功能性,那里有一个刹车。因此,多重性是一个可以理解的附加条件。

这也出现了。

关于交易、自动交易系统和策略测试的论坛

新版MetaTrader 5 build 1930:MQL5中的浮动图表窗口和.Net库

MetaQuotes软件公司。, 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[]数组,并从int[]数组中转换 出来吗?

为什么是int,而不是char?

(而且时间会更长--会复制得更快)

 
Taras Slobodyanik:

为什么是英特?

 
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:

一般来说,解决方案是在同一环节,但由于普遍性,有刹车的情况。因此,多重性是一个可以理解的附加条件。

这也出现了。

谁将控制这种多重性?