Ошибки, баги, вопросы - страница 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()

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

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

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

 
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 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

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+добавка short doubleint

Или 2+добавка|4|4|4

 
Alexey Viktorov:

Не совсем так.

максимальное поле 8 байт, задали выравнивание 4 и получили 16. То-есть 2+2|4|2+2|2+добавка short doubleint

Или 2+добавка|4|4|4

да, тогда наверное так корректно звучать должно:

итого: pack() выполняет выравнивание данных в структуре поэлементно , каждый элемент будет дополнен  значением кратным  pack()  с учетом  максимального sizeof() элемента  структуры  (не более максимального значения, менее может быть при дополнении)

pack(4)  :

short   = 2 + 2 дополним  = 4   = pack(4) 

double  = 8 -  не выравниваем

int = 4   - не выравниваем

sizeof() = 16   байт

 
Igor Makanu:

да, тогда наверное так корректно звучать должно:

итого: pack() выполняет выравнивание данных в структуре поэлементно , каждый элемент будет дополнен  значением кратным  pack()  с учетом  максимального sizeof() элемента  структуры  (не более максимального значения, менее может быть при дополнении)

pack(4)  :

short   = 2 + 2 дополним  = 4   = pack(4) 

double  = 8 -  не выравниваем

int = 4   - не выравниваем

sizeof() = 16   байт

Замудрёно звучит, но мне понятно.)))

 
Alexey Viktorov:

Замудрёно звучит, но мне понятно.)))

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

Ошибки, баги, вопросы

fxsaber, 2019.07.07 15:03

от порядка полей зависит потребление памяти и, видимо, производительность.

Пока не смог до конца понять.

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