Errori, bug, domande - pagina 2501

 
fxsaber:

Questo è quello che succede.

ha provato così:

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


azzeriamo ancora solo i primi 4 byte

 

ha provato in un altro modo:

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

ancora nessun risultato - cancella solo i primi 4 byte

 
Igor Makanu:

ancora nessun risultato - cancella solo i primi 4 byte

Perché fisicamente la struttura è di 4 byte.

 
fxsaber:

Perché fisicamente la struttura è di 4 byte.

sì, abbiamo già capito che pack() non funziona in MQL - non ho altre opzioni per controllarepack()

Ho pensato di controllare in .dll in C# ma c'è un problema anche lì - MQL vede la firma della funzione chiamata (ricordate la chiamata const nelle firme non ha funzionato per C# )

e quando si trasferiscono i dati in C# sarà possibile fare la conversione dei tipi?

ZS: al massimo, scrivi una .dll in C++ - puoi ricevere / inviare dati "puliti" lì

 
fxsaber:

Non ricordo se è nella documentazione.

Grazie, l'ho trovato. Tutto funziona secondo me. Poiché nel tuo esempio c'è solo un tipo nella struttura, non ha senso allinearlo. Ecco perché dà solo la dimensione del tipo. E qui avete

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

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

Ecco la struttura

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

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

La documentazione lo spiega molto chiaramente in immagini.


 
Alexey Viktorov:

Grazie, l'ho trovato. Tutto funziona secondo me. Poiché nel tuo esempio c'è solo un tipo nella struttura, non ha senso allinearlo. Ecco perché dà solo la dimensione del tipo. E qui abbiamo

E questa struttura

La documentazione lo spiega molto chiaramente in immagini.


Sì, è così che funziona:

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

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



totale: pack() esegue l'allineamento dei dati nella struttura per la dimensione del campo massimo sizeof() della struttura

 
Igor Makanu:

sommario: pack() allinea i dati nella struttura per la dimensione del campo massimo sizeof() della struttura

Non esattamente.

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

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

Il campo massimo è di 8 byte; impostiamo l'allineamento a 4 e otteniamo 16. Cioè 2+2|4|2+2|2+addshort doubleint

Oppure 2+addizione|4|4|4

 
Alexey Viktorov:

Non esattamente.

Il campo massimo è di 8 byte, impostate l'allineamento a 4 e ottenete 16. Quindi 2+2|4|2+2|2+add short doubleint

Oppure 2+addizione|4|4|4

Sì, probabilmente dovrebbe suonare bene:

in sintesi: pack() esegue l'allineamento elemento per elemento dei dati nella struttura; ogni elemento sarà aggiunto con un valore multiplo di pack() tenendo conto della dimensione massima di() dell'elemento della struttura (non più del valore massimo, meno può essere in aggiunta)

pack(4) :

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

double =8 - non collassare

int =4 - non allineato

sizeof()=16 byte

 
Igor Makanu:

Sì, probabilmente è così che dovrebbe suonare:

totale: pack() esegue l'allineamento dei dati nella struttura elemento per elemento, ogni elemento sarà un multiplo di pack() tenendo conto della massima sizeof() dell'elemento della struttura (non più del valore massimo, meno può essere in aggiunta)

pack(4) :

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

double =8 - non collassare

int =4 - non allineato

sizeof()=16 byte

Sembra contorto, ma per me ha senso)).

 
Alexey Viktorov:

Sembra contorto, ma ha senso per me.)))

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

fxsaber, 2019.07.07 15:03

L'ordine dei campi influisce sul consumo di memoria e apparentemente sulle prestazioni.

Non sono ancora riuscito a capirlo completamente.