Hatalar, hatalar, sorular - sayfa 2501

 
fxsaber :

böyle gidiyor

şöyle denedi:

 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


hala sadece ilk 4 baytı sıfırlayın

 

ayrıca şöyle denedi:

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

hala sonuç yok - yalnızca ilk 4 bayt sıfırlandı

 
Igor Makanu :

hala sonuç yok - yalnızca ilk 4 bayt sıfırlandı

Çünkü 4 bayttan fiziksel yapı.

 
fxsaber :

Çünkü 4 bayttan fiziksel yapı.

evet, pack() öğesinin MQL içinde çalışmadığını zaten öğrendik - artık pack() kontrolleri için seçeneğim yok

C#'da .dll'yi kontrol etmeyi düşündüm, ancak bir pusu da var - MQL çağrılan işlevin imzasını görüyor (unutmayın, imzalarda const çağrılırken C# çağrılamaz),

ve verileri C#'a aktarırken türleri dönüştürmek mümkün olacak mı?

Not: C ++'da maksimum .dll yazın - orada "temiz" veri alabilir / gönderebilirsiniz

 
fxsaber :

Belgelerde olup olmadığını hatırlamıyorum.

Teşekkürler, buldum. Bana göre her şey çalışıyor. Örneğinizde yapıda tek tip olduğu için hizalamanın bir anlamı yok. Bu nedenle sadece tipin boyutunu verir. Ve işte böyle çıkıyor

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

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

Ve böyle bir yapı

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

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

Belgeler resimlerde çok net bir şekilde açıklanmıştır.


 
Alexey Viktorov :

Teşekkürler, buldum. Bana göre her şey çalışıyor. Örneğinizde yapıda tek tip olduğu için hizalamanın bir anlamı yok. Bu nedenle sadece tipin boyutunu verir. Ve işte böyle çıkıyor

Ve böyle bir yapı

Belgeler resimlerde çok net bir şekilde açıklanmıştır.


evet, şu şekilde çalışır:

 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



total: pack(), yapıdaki verileri, yapının sizeof() maksimum alanının boyutuna göre hizalar

 
Igor Makanu :

total: pack(), yapıdaki verileri, yapının sizeof() maksimum alanının boyutuna göre hizalar

Kesinlikle bu şekilde değil.

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

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

maksimum alan 8 bayttır, hizalamayı 4'e ayarladık ve 16 aldık. Yani, 2 + 2|4|2 + 2|2 + kısa çift toplama int

veya 2 +katkı| 4|4 |4

 
Alexey Viktorov :

Kesinlikle bu şekilde değil.

maksimum alan 8 bayttır, hizalamayı 4'e ayarladık ve 16 aldık. Yani, 2 + 2|4|2 + 2|2 + kısa double int'nin eklenmesi

veya 2 +katkı| 4|4 |4

evet, o zaman muhtemelen şöyle görünmelidir:

total: pack(), yapı öğesindeki verileri öğeye göre hizalar, her öğe, yapı öğesinin maksimum sizeof() değeri (maksimum değerinden daha fazla değil, dolgu yaparken daha az olun)

paket(4) :

kısa = 2 + 2 tümleyen = 4    = paket(4)  

çift = 8 - hizalama

int = 4 - hizalama

sizeof() = 16 bayt

 
Igor Makanu :

evet, o zaman muhtemelen şöyle görünmelidir:

total: pack(), yapı öğesindeki verileri öğeye göre hizalar, her öğe, yapı öğesinin maksimum sizeof() değeri (maksimum değerinden daha fazla değil, dolgu yaparken daha az olun)

paket(4) :

kısa = 2 + 2 tümleyen = 4    = paket(4)  

çift = 8 - hizalama

int = 4 - hizalama

sizeof() = 16 bayt

Kulağa tuhaf geliyor ama anlıyorum.

 
Alexey Viktorov :

Kulağa tuhaf geliyor ama anlıyorum.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

fxsaber , 2019.07.07 15:03

bellek tüketimi ve görünüşe göre performans, alanların sırasına bağlıdır .

Şu ana kadar tam olarak anlayamadım.