エラー、バグ、質問 - ページ 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

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バイトの構造体だからです。

はい、MQL内部でpack()が動作しないことは既に判明しています。pack()を 確認するためのオプションはもうありません。

C#の.dllでチェックしようと思いましたが、そこにも問題があります。MQLは呼び出された関数の シグネチャを見ます(シグネチャのconst呼び出しはC#では機能しなかったことを覚えておいてください)。

また、C#にデータを転送する際、型変換はできるのでしょうか?

ZS: せいぜいC++で.dllを書くくらいで、そこで受信/送信するデータを "クリーン "にできます。

 
fxsaber:

ドキュメントに書いてあったかは覚えていませんが。

ありがとうございます、見つけました。私の中では、すべてがうまくいっています。この例では、構造体が1種類しかないので、整列の意味がありません。そのため、活字の大きさしかわからないのです。そして、ここにあるのは

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:

ありがとうございます、見つけました。私の中では、すべてがうまくいっています。この例では、構造体が1種類しかないので、整列の意味がありません。そのため、活字のサイズしか表示されないのです。そして、ここで私たちは

そして、この構造

ドキュメントでは、写真でとてもわかりやすく説明しています。


そう、そういうことなんです。

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

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() は、構造体の最大 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+addshort doubleint です。

または2+addition|4|4|4。

 
Alexey Viktorov:

そうではありません。

最大フィールドは8バイトで、アライメントを4に設定し、16を取得します。つまり、2+2|4|2+2+add short doubleint です。

または2+addition|4|4|4。

そうですね、おそらく正しい音になるはずです。

要約すると,pack() は構造体内のデータを要素ごとに整列させます.各要素には構造体要素の最大 sizeof() を考慮した pack() の倍数の値が付加さ れます(最大値以下は付加されないかもしれません)

pack(4) :

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

double =8 - 折りたたまないでください。

int =4 - アライメントされていません。

sizeof()=16 バイト

 
Igor Makanu:

そうですね、そういうふうに聞こえるかもしれませんね。

total: pack() は,構造体内のデータの整列を要素ごとに行い,各要素は構造体要素の最大 sizeof() を考慮した pack() の倍数と なります(最大値 以下は加算してもよい).

pack(4) :

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

double =8 - 折りたたまないでください。

int =4 - アライメントされていません。

sizeof()=16 バイト

複雑なようでいて、ちゃんと意味があるんですね(笑))

 
Alexey Viktorov:

複雑に聞こえるが、私には意味がある)))

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber, 2019.07.07 15:03

フィールドの順番は、メモリ消費量や 見かけ上のパフォーマンスに影響します。

まだ完全に理解できていない。