错误、漏洞、问题 - 页 2501 1...249424952496249724982499250025012502250325042505250625072508...3184 新评论 Igor Makanu 2019.07.07 14:32 #25001 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个字节清零 Igor Makanu 2019.07.07 14:42 #25002 尝试了另一种方式。 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个字节 fxsaber 2019.07.07 14:49 #25003 Igor Makanu: 仍然没有结果 - 只清除了前4个字节 因为从物理上讲,该结构是4个字节。 Igor Makanu 2019.07.07 15:02 #25004 fxsaber: 因为从物理上讲,该结构是4个字节。 是的,我们已经发现pack()在MQL中不起作用 - 我没有更多的选项来检查pack() 我想过在C#中检查.dll,但那里也有一个问题 - MQL看到了被调用函数的 签名(记得签名中的const调用对C#不起作用)。 而当把数据传输到C#时,是否可以进行类型转换? ZS:最多只能用C++编写一个.dll,你可以在那里接收/发送 "干净 "的数据。 Alexey Viktorov 2019.07.07 15:09 #25005 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 } 文件中的图片解释得非常清楚。 Igor Makanu 2019.07.07 15:23 #25006 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()字段的大小执行数据对齐。 Alexey Viktorov 2019.07.07 15:29 #25007 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 Igor Makanu 2019.07.07 15:47 #25008 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 字节 Alexey Viktorov 2019.07.07 16:06 #25009 Igor Makanu: 是的,这可能是它应该有的声音。 总计:pack()在结构元素中逐个执行数据排列,每个元素将是 pack()的倍数,同时考虑到结构元素的最大sizeof()(不超过最大值,少的可以加)。 包(4) : short = 2 + 2 appended = 4=pack(4) double =8 - 不要塌陷 int =4 - 不对齐 sizeof()=16 字节 这听起来很曲折,但对我来说是有意义的)。 fxsaber 2019.07.07 16:51 #25010 Alexey Viktorov: 听起来很曲折,但对我来说很有意义。) 关于交易、自动交易系统和交易策略测试的论坛 虫子,虫子,问题 fxsaber, 2019.07.07 15:03 字段的顺序会影响到内存消耗 和明显的性能。 还没能完全理解它。 1...249424952496249724982499250025012502250325042505250625072508...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
这就是所发生的事情。
像这样试了一下。
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个字节清零
尝试了另一种方式。
仍然没有结果 - 只清除了前4个字节
仍然没有结果 - 只清除了前4个字节
因为从物理上讲,该结构是4个字节。
因为从物理上讲,该结构是4个字节。
是的,我们已经发现pack()在MQL中不起作用 - 我没有更多的选项来检查pack()
我想过在C#中检查.dll,但那里也有一个问题 - MQL看到了被调用函数的 签名(记得签名中的const调用对C#不起作用)。
而当把数据传输到C#时,是否可以进行类型转换?
ZS:最多只能用C++编写一个.dll,你可以在那里接收/发送 "干净 "的数据。
我不记得文档中是否有这个内容。
谢谢你,我找到了。在我看来,一切都很有效。因为在你的例子中,结构中只有一种类型,所以没有必要对齐。这就是为什么它只给出字体的大小。而在这里,我们有
以下是其结构
文件中的图片解释得非常清楚。
谢谢你,我找到了。在我看来,一切都很有效。因为在你的例子中,结构中只有一种类型,所以没有必要对齐。这就是为什么它只给出字体大小。而在这里,我们有
而这种结构
文件中的图片解释得非常清楚。
是的,这就是它的作用。
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()字段的大小执行数据对齐。
摘要:pack()将结构中的数据按结构的最大sizeof()字段的大小进行对齐。
并非如此。
最大的字段是8个字节;我们将对齐方式设置为4,得到16个字节。那就是2+2|4|2+2|2+加短 双 int
或2+加法|4|4|4|4
并非如此。
最大的字段是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 字节
是的,这可能是它应该有的声音。
总计:pack()在结构元素中逐个执行数据排列,每个元素将是 pack()的倍数,同时考虑到结构元素的最大sizeof()(不超过最大值,少的可以加)。
包(4) :
short = 2 + 2 appended = 4=pack(4)
double =8 - 不要塌陷
int =4 - 不对齐
sizeof()=16 字节
这听起来很曲折,但对我来说是有意义的)。
听起来很曲折,但对我来说很有意义。)
关于交易、自动交易系统和交易策略测试的论坛
虫子,虫子,问题
fxsaber, 2019.07.07 15:03
字段的顺序会影响到内存消耗 和明显的性能。
还没能完全理解它。