Errores, fallos, preguntas - página 2501

 
fxsaber:

Esto es lo que ocurre.

lo intentó así:

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


seguimos poniendo a cero los primeros 4 bytes

 

lo intenté de otra manera:

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));
  }
//+------------------------------------------------------------------+

todavía no hay resultado - sólo borra los primeros 4 bytes

 
Igor Makanu:

todavía no hay resultado - sólo borra los primeros 4 bytes

Porque físicamente la estructura es de 4 bytes.

 
fxsaber:

Porque físicamente la estructura es de 4 bytes.

Sí, ya nos hemos dado cuenta de que pack() no funciona dentro de MQL - no tengo más opciones para comprobarpack()

Pensé en comprobar en .dll en C# pero hay un problema allí también - MQL ve la firma de la función llamada (recuerde la llamada const en las firmas no funcionó para C# )

y al transferir los datos a C# ¿se podrá hacer la conversión de tipos?

ZS: a lo sumo, escribe una .dll en C++ - puedes recibir / enviar datos "limpios" allí

 
fxsaber:

No recuerdo si está en la documentación.

Gracias, lo he encontrado. En mi opinión, todo funciona. Como en tu ejemplo sólo hay un tipo en la estructura, no tiene sentido la alineación. Por eso sólo da el tamaño del tipo. Y aquí tenemos

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

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

Esta es la estructura

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

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

La documentación lo explica muy claramente en imágenes.


 
Alexey Viktorov:

Gracias, lo he encontrado. En mi opinión, todo funciona. Como en tu ejemplo sólo hay un tipo en la estructura, no tiene sentido la alineación. Por eso sólo da el tamaño del tipo. Y aquí tenemos

Y esta estructura

La documentación lo explica muy claramente en imágenes.


Sí, así es como funciona:

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

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



total: pack() realiza la alineación de los datos en la estructura por el tamaño del campo sizeof() máximo de la estructura

 
Igor Makanu:

resumen: pack() alinea los datos de la estructura por el tamaño del campo sizeof() máximo de la estructura

No exactamente.

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

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

El campo máximo es de 8 bytes; fijamos la alineación en 4 y obtenemos 16. Es decir, 2+2|4|2+2+addshort doubleint

O 2+adición|4|4|4

 
Alexey Viktorov:

No exactamente.

El campo máximo es de 8 bytes, si se ajusta la alineación a 4 se obtienen 16. Así que 2+2|4|2+2|2+add short doubleint

O 2+adición|4|4|4

Sí, eso debería sonar bien:

en resumen: pack() realiza la alineación elemento a elemento de los datos de la estructura; cada elemento se anexará con un valor múltiplo de pack() teniendo en cuenta el sizeof() máximo del elemento de la estructura (no más que el valor máximo, menos puede ser en appending)

paquete(4) :

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

doble =8 - no colapsar

int =4 - no alineado

sizeof()=16 bytes

 
Igor Makanu:

Sí, así es como debería sonar:

total: pack() realiza la alineación de los datos en la estructura elemento por elemento, cada elemento será un múltiplo de pack() teniendo en cuenta el tamaño máximo de sizeof() del elemento de la estructura (no más que el valor máximo, menos puede ser además)

paquete(4) :

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

doble =8 - no colapsar

int =4 - no alineado

sizeof()=16 bytes

Suena enrevesado, pero para mí tiene sentido).

 
Alexey Viktorov:

Suena enrevesado, pero para mí tiene sentido))).

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

fxsaber, 2019.07.07 15:03

Elorden de los campos afecta al consumo de memoria y, aparentemente, al rendimiento.

Todavía no he podido entenderlo del todo.