오류, 버그, 질문 - 페이지 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) ㅏ:

2019.07.07 18:31:02.708 tst (EURUSD,H1) 0 4294967295 4294967295 4294967295

2019.07.07 18:31:02.708 tst (EURUSD,H1) 비:

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바이트만 0으로 만듭니다.

 

또한 다음과 같이 시도했습니다.

 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() 검사를 위한 옵션이 없습니다

C#에서 .dll을 체크인하려고 생각했지만 매복도 있습니다. MQL은 호출된 함수 의 서명을 봅니다(서명에서 const를 호출할 때 C#을 호출할 수 없었음을 기억하십시오).

데이터를 C#에 전달할 때 유형을 변환할 수 있습니까?

추신: C++에서 최대 .dll 쓰기 - "깨끗한" 데이터를 수신/전송할 수 있습니다.

 
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) ㅏ:

2019.07.07 19:16:27.100 tst (EURUSD,H1) 0 0 0 4294967295

2019.07.07 19:16:27.100 tst (EURUSD,H1) 비:

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()은 구조의 데이터를 구조의 최대 필드 sizeof() 크기에 맞춥니다.

 
Igor Makanu :

total: 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 + 짧은 이중 더하기 정수

또는 2 +첨가제| 4|4 |4

 
Alexey Viktorov :

확실히 그런 방식은 아닙니다.

최대 필드는 8바이트이고 정렬을 4로 설정하고 16을 얻었습니다. 즉, 2 + 2|4|2 + 2|2 + short double int 추가

또는 2 +첨가제| 4|4 |4

예, 아마도 다음과 같이 들릴 것입니다.

total: pack()은 구조 요소의 데이터를 요소별로 정렬합니다. 각 요소는 구조 요소최대 sizeof()를 고려하여 pack()의 배수로 채워집니다(최대값 이하, 패딩할 때 더 적게)

팩(4) :

짧은 = 2 + 2 보수 = 4    = 팩(4)  

더블 = 8 - 정렬하지 않는다

정수 = 4 - 정렬하지 않는다

sizeof() = 16 바이트

 
Igor Makanu :

예, 아마도 다음과 같이 들릴 것입니다.

total: pack()은 구조 요소의 데이터를 요소별로 정렬합니다. 각 요소는 구조 요소최대 sizeof()를 고려하여 pack()의 배수로 채워집니다(최대값 이하, 패딩할 때 더 적게)

팩(4) :

짧은 = 2 + 2 보수 = 4    = 팩(4)  

더블 = 8 - 정렬하지 않는다

정수 = 4 - 정렬하지 않는다

sizeof() = 16 바이트

이상하게 들리지만 알겠습니다.

 
Alexey Viktorov :

이상하게 들리지만 알겠습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

fxsaber , 2019.07.07 15:03

메모리 소비와 분명히 성능은 필드의 순서에 따라 다릅니다 .

지금까지는 완전히 이해하지 못했습니다.