Ошибки, баги, вопросы - страница 2500

 
fxsaber:

Давно, как присутствует.

Не помните где об этом писали?

 
fxsaber:

Тогда боюсь, смысл выравнивания теряется

попробовал в байтах посмотреть что выравнивание делает:

#property strict

const uint FFFF=0xFFFFFFFF;
//+------------------------------------------------------------------+
struct A pack(4)
  {
   ushort            j;
  };
//+------------------------------------------------------------------+
struct B pack(8)
  {
   ushort            j;
  };
//+------------------------------------------------------------------+
union UnionCheckByte
  {
   uint              byte_2x4[2];
   A                 a;
   B                 b;
  };
//+------------------------------------------------------------------+
void OnStart()
  {
   UnionCheckByte tst;
   tst.byte_2x4[0]=FFFF;   tst.byte_2x4[1]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   Print("0xFFFFFFFF FFFFFFFF = ",tst.byte_2x4[0],",",tst.byte_2x4[1]);   // проверим
   
   
   
   tst.byte_2x4[0]=FFFF;   tst.byte_2x4[1]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   tst.a.j=0;
   Print("A.  = ",tst.byte_2x4[0],",",tst.byte_2x4[1]);   // проверим



   tst.byte_2x4[0]=FFFF;   tst.byte_2x4[1]=FFFF;   // заполним память 0xFFFFFFFF FFFFFFFF
   tst.b.j=0;
   Print("B.  = ",tst.byte_2x4[0],",",tst.byte_2x4[1]);   // проверим
  }
//+------------------------------------------------------------------+

2019.07.07 17:51:30.601 tst (EURUSD,H1) 0xFFFFFFFF FFFFFFFF = 4294967295,4294967295

2019.07.07 17:51:30.601 tst (EURUSD,H1) A.  = 4294901760,4294967295

2019.07.07 17:51:30.601 tst (EURUSD,H1) B.  = 4294901760,4294967295




или я еще не проснулся, или не работает выравнивание pack(4) / pack(8) , я компилятору однозначно указал размеры структур A и B


даже так:

 ZeroMemory(tst.a);   //tst.a.j=0;
ничего не изменилось
 
Alexey Viktorov:

Не помните где об этом писали?

Не помню, в документации об этом есть.

 
Igor Makanu:

попробовал в байтах посмотреть что выравнивание делает:

или я еще не проснулся, или не работает выравнивание pack(4) / pack(8) , я компилятору однозначно указал размеры структур A и B

Так с этого и началось данное обсуждение. Оказалось, что все совсем не так.

Ну и пример некорректный все таки. Обнуляя ushort-поле, добавочные байты вовсе не обязаны меняться.


ZeroMemory, скорее всего, ориентируется на sizeof, а он двойка в обоих случаях по каким-то своих причинам.

 
fxsaber:

Так с этого и началось данное обсуждение. Оказалось, что все совсем не так.

1. Ну и пример некорректный все таки. Обнуляя ushort-поле, добавочные байты вовсе не обязаны меняться.


2 ZeroMemory, скорее всего, ориентируется на sizeof, а он двойка в обоих случаях по каким-то своих причинам.


1. да согласен

2. ZeroMemory как раз и должен мне обнулить память


в общем не вижу я смысла в pack() в чистом MQL, максимум можно в .dll погонять данные, но уж там то точно должно работать - так разработчики заявили

 
Igor Makanu:

2. ZeroMemory как раз и должен мне обнулить память

Так и происходит

struct A pack(4)
{
  short j;
  char i;
};

union U
{
  A a;
  uchar Bytes[sizeof(A)];
  
  U() { ArrayInitialize(this.Bytes, (char)0xFF); }
};

void OnStart()
{
  U u;
  
  ArrayPrint(u.Bytes); // 255 255 255 255
  
  ZeroMemory(u.a);
  ArrayPrint(u.Bytes); // 0 0 0 0
}
 
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()

думал в .dll  проверить на С#, а ведь там тоже засада - MQL видит сигнатуру вызываемой функции (помните при вызове const в сигнатурах не получилось вызвать C# ),

и при передаче данных в C# возможно будет преобразование типов?

ЗЫ: максимум .dll на C++ писать - там можно "чистые" данные принять / отправить