エラー、バグ、質問 - ページ 2501 1...249424952496249724982499250025012502250325042505250625072508...3185 新しいコメント Igor Makanu 2019.07.07 14:32 #25001 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バイトをゼロにするだけです。 Igor Makanu 2019.07.07 14:42 #25002 は別の方法を試してみました。 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バイトがクリアされるだけです。 fxsaber 2019.07.07 14:49 #25003 Igor Makanu: 最初の4バイトがクリアされるだけです。 物理的には4バイトの構造体だからです。 Igor Makanu 2019.07.07 15:02 #25004 fxsaber: 物理的には4バイトの構造体だからです。 はい、MQL内部でpack()が動作しないことは既に判明しています。pack()を 確認するためのオプションはもうありません。 C#の.dllでチェックしようと思いましたが、そこにも問題があります。MQLは呼び出された関数の シグネチャを見ます(シグネチャのconst呼び出しはC#では機能しなかったことを覚えておいてください)。 また、C#にデータを転送する際、型変換はできるのでしょうか? ZS: せいぜいC++で.dllを書くくらいで、そこで受信/送信するデータを "クリーン "にできます。 Alexey Viktorov 2019.07.07 15:09 #25005 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 } ドキュメントでは、写真でとてもわかりやすく説明しています。 Igor Makanu 2019.07.07 15:23 #25006 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() フィールドのサイズだけ、構造体内のデータアライメントを行う。 Alexey Viktorov 2019.07.07 15:29 #25007 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。 Igor Makanu 2019.07.07 15:47 #25008 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 バイト Alexey Viktorov 2019.07.07 16:06 #25009 Igor Makanu: そうですね、そういうふうに聞こえるかもしれませんね。 total: pack() は,構造体内のデータの整列を要素ごとに行い,各要素は構造体要素の最大 sizeof() を考慮した pack() の倍数と なります(最大値 以下は加算してもよい). pack(4) : short = 2 + 2 appended = 4=pack(4) double =8 - 折りたたまないでください。 int =4 - アライメントされていません。 sizeof()=16 バイト 複雑なようでいて、ちゃんと意味があるんですね(笑)) fxsaber 2019.07.07 16:51 #25010 Alexey Viktorov: 複雑に聞こえるが、私には意味がある))) トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム バグ、バグ、質問 fxsaber, 2019.07.07 15:03 フィールドの順番は、メモリ消費量や 見かけ上のパフォーマンスに影響します。 まだ完全に理解できていない。 1...249424952496249724982499250025012502250325042505250625072508...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
こうなるのです。
は、こんな風にやってみました。
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バイトをゼロにするだけです。
は別の方法を試してみました。
最初の4バイトがクリアされるだけです。
最初の4バイトがクリアされるだけです。
物理的には4バイトの構造体だからです。
物理的には4バイトの構造体だからです。
はい、MQL内部でpack()が動作しないことは既に判明しています。pack()を 確認するためのオプションはもうありません。
C#の.dllでチェックしようと思いましたが、そこにも問題があります。MQLは呼び出された関数の シグネチャを見ます(シグネチャのconst呼び出しはC#では機能しなかったことを覚えておいてください)。
また、C#にデータを転送する際、型変換はできるのでしょうか?
ZS: せいぜいC++で.dllを書くくらいで、そこで受信/送信するデータを "クリーン "にできます。
ドキュメントに書いてあったかは覚えていませんが。
ありがとうございます、見つけました。私の中では、すべてがうまくいっています。この例では、構造体が1種類しかないので、整列の意味がありません。そのため、活字の大きさしかわからないのです。そして、ここにあるのは
以下はその構成です。
ドキュメントでは、写真でとてもわかりやすく説明しています。
ありがとうございます、見つけました。私の中では、すべてがうまくいっています。この例では、構造体が1種類しかないので、整列の意味がありません。そのため、活字のサイズしか表示されないのです。そして、ここで私たちは
そして、この構造
ドキュメントでは、写真でとてもわかりやすく説明しています。
そう、そういうことなんです。
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() フィールドのサイズだけ、構造体内のデータアライメントを行う。
要約: pack() は、構造体のデータを構造体の最大 sizeof() フィールドの大きさで整列させます。
そうではありません。
最大フィールドは8バイトであり、アライメントを4にして16を得る。つまり、2+2|4|2+2|2+addshort doubleint です。
または2+addition|4|4|4。
そうではありません。
最大フィールドは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 バイト
そうですね、そういうふうに聞こえるかもしれませんね。
total: pack() は,構造体内のデータの整列を要素ごとに行い,各要素は構造体要素の最大 sizeof() を考慮した pack() の倍数と なります(最大値 以下は加算してもよい).
pack(4) :
short = 2 + 2 appended = 4=pack(4)
double =8 - 折りたたまないでください。
int =4 - アライメントされていません。
sizeof()=16 バイト
複雑なようでいて、ちゃんと意味があるんですね(笑))
複雑に聞こえるが、私には意味がある)))
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
バグ、バグ、質問
fxsaber, 2019.07.07 15:03
フィールドの順番は、メモリ消費量や 見かけ上のパフォーマンスに影響します。
まだ完全に理解できていない。