错误、漏洞、问题 - 页 2501

 
fxsaber:

这就是所发生的事情。

像这样试了一下。

const uint FFFF=0xFFFFFFFF;
//+------------------------------------------------------------------+
struct A pack(4)
  {
   ushort            j1;
   ushort            j2;
  };
//+------------------------------------------------------------------+
struct B pack(8)
  {
   ushort            j1;
   ushort            j2;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
union UnionCheckByte
  {
   uint              byte_4x4[4];
   A                 a;
   B                 b;
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   UnionCheckByte tst;
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   ArrayPrint(tst.byte_4x4);
// A   
   Print("A:");
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   A zeroA;
   ZeroMemory(zeroA);
   tst.a = zeroA;
   ArrayPrint(tst.byte_4x4);
   
// B
   Print("B:");
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   B zeroB;
   ZeroMemory(zeroB);
   tst.b = zeroB;
   ArrayPrint(tst.byte_4x4);
 
   Print("sizeof(A) = ",sizeof(A)," , sizeof(B) = ",sizeof(B));
  }
//+------------------------------------------------------------------+

2019.07.07 18:31:02.708 tst (EURUSD,H1) 4294967295 4294967295 4294967295 4294967295

2019.07.07 18:31:02.708 tst (EURUSD,H1) A

2019.07.07 18:31:02.708 tst (EURUSD,H1) 0 4294967295 4294967295 4294967295

2019.07.07 18:31:02.708 tst (EURUSD,H1) B

2019.07.07 18:31:02.708 tst (EURUSD,H1) 0 4294967295 4294967295 4294967295

2019.07.07 18:31:02.708 tst (EURUSD,H1) sizeof(A) = 4 , sizeof(B) = 4


我们仍然只将前4个字节清零

 

尝试了另一种方式。

const uint FFFF=0xFFFFFFFF;
//+------------------------------------------------------------------+
union UnionCheckByte
  {
   uint              byte_4x4[4];
   struct uA pack(4) {ushort j1; ushort j2; } a;
   struct uB pack(8) {ushort j1; ushort j2; } b;
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   UnionCheckByte tst;
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   ArrayPrint(tst.byte_4x4);
// A   
   Print("A:");
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   
   ZeroMemory(tst.a);
   ArrayPrint(tst.byte_4x4);
   
// B
   Print("B:");
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   ZeroMemory(tst.b);
   ArrayPrint(tst.byte_4x4);
 
   Print("sizeof(A) = ",sizeof(tst.a)," , sizeof(B) = ",sizeof(tst.b));
  }
//+------------------------------------------------------------------+

仍然没有结果 - 只清除了前4个字节

 
Igor Makanu:

仍然没有结果 - 只清除了前4个字节

因为从物理上讲,该结构是4个字节。

 
fxsaber:

因为从物理上讲,该结构是4个字节。

是的,我们已经发现pack()在MQL中不起作用 - 我没有更多的选项来检查pack()

我想过在C#中检查.dll,但那里也有一个问题 - MQL看到了被调用函数的 签名(记得签名中的const调用对C#不起作用)。

而当把数据传输到C#时,是否可以进行类型转换?

ZS:最多只能用C++编写一个.dll,你可以在那里接收/发送 "干净 "的数据。

 
fxsaber:

我不记得文档中是否有这个内容。

谢谢你,我找到了。在我看来,一切都很有效。因为在你的例子中,结构中只有一种类型,所以没有必要对齐。这就是为什么它只给出字体的大小。而在这里,我们有

struct A pack(4)
{
  short j;
  int   z;
};

void OnStart()
{
  Print(sizeof(A)); // 8
}

以下是其结构

struct A pack(8)
{
  short   j;
  double  x;
  int     b;
};

void OnStart()
{
  Print(sizeof(A)); // 24
}

文件中的图片解释得非常清楚。


 
Alexey Viktorov:

谢谢你,我找到了。在我看来,一切都很有效。因为在你的例子中,结构中只有一种类型,所以没有必要对齐。这就是为什么它只给出字体大小。而在这里,我们有

而这种结构

文件中的图片解释得非常清楚。


是的,这就是它的作用。

const uint FFFF=0xFFFFFFFF;
//+------------------------------------------------------------------+
union UnionCheckByte
  {
   uint              byte_4x4[4];
   struct uA pack(4) {ushort j1; ulong j2; } a;
   struct uB pack(8) {ushort j1; ulong j2; } b;
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   UnionCheckByte tst;
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   ArrayPrint(tst.byte_4x4);
// A   
   Print("A:");
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   
   ZeroMemory(tst.a);
   ArrayPrint(tst.byte_4x4);
   
// B
   Print("B:");
   tst.byte_4x4[0]=FFFF;   tst.byte_4x4[1]=FFFF;   tst.byte_4x4[2]=FFFF;   tst.byte_4x4[3]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   ZeroMemory(tst.b);
   ArrayPrint(tst.byte_4x4);
 
   Print("sizeof(A) = ",sizeof(tst.a)," , sizeof(B) = ",sizeof(tst.b));
  }
//+------------------------------------------------------------------+

2019.07.07 19:16:27.100 tst (EURUSD,H1) 4294967295 4294967295 4294967295 4294967295

2019.07.07 19:16:27.100 tst (EURUSD,H1) A

2019.07.07 19:16:27.100 tst (EURUSD,H1) 0 0 0 0 4294967295

2019.07.07 19:16:27.100 tst (EURUSD,H1) B:

2019.07.07 19:16:27.100 tst (EURUSD,H1) 0 0 0 0 0 0

2019.07.07 19:16:27.100 tst (EURUSD,H1) sizeof(A) = 12 , sizeof(B) = 16



总计:pack()在结构中按结构的最大sizeof()字段的大小执行数据对齐。

 
Igor Makanu:

摘要:pack()将结构中的数据按结构的最大sizeof()字段的大小进行对齐。

并非如此。

struct A pack(4)
{
  short   j;
  double  x;
  int     b;
};

void OnStart()
{
  Print(sizeof(A)); // 16
}

最大的字段是8个字节;我们将对齐方式设置为4,得到16个字节。那就是2+2|4|2+2|2+加短 int

2+加法|4|4|4|4

 
Alexey Viktorov:

并非如此。

最大的字段是8个字节,设置对齐方式为4,得到16个。因此,2+2|4|2+2|2+ 加短 双int

2+加法|4|4|4|4

是的,这听起来应该是对的。

综上所述:pack()对结构中的数据进行逐个元素的排列;每个元素将被追加一个 pack()的倍数,同时考虑到结构元素的最大sizeof()值(不超过最大值,少了也可以追加)。

包(4) :

short = 2 + 2 appended = 4=pack(4)

double =8 - 不要塌陷

int =4 - 不要对齐

sizeof()=16 字节

 
Igor Makanu:

是的,这可能是它应该有的声音。

总计:pack()在结构元素中逐个执行数据排列,每个元素将是 pack()的倍数,同时考虑到结构元素的最大sizeof()(不超过最大值,少的可以加)。

包(4) :

short = 2 + 2 appended = 4=pack(4)

double =8 - 不要塌陷

int =4 - 不对齐

sizeof()=16 字节

这听起来很曲折,但对我来说是有意义的)。

 
Alexey Viktorov:

听起来很曲折,但对我来说很有意义。)

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

虫子,虫子,问题

fxsaber, 2019.07.07 15:03

字段的顺序会影响到内存消耗 和明显的性能。

还没能完全理解它。