記事「PrintFormat()を調べてすぐ使える例を適用する」についてのディスカッション

 

新しい記事「PrintFormat()を調べてすぐ使える例を適用する」はパブリッシュされました:

この記事は、初心者にも経験豊富な開発者にも役立つでしょう。PrintFormat()関数について調べ、文字列フォーマットの例を分析し、ターミナルのログに様々な情報を表示するためのテンプレートを書きます。

ログやモニター画面に値を表示するのは、「Hello, world」よりも複雑なものを表示しなくていい限り、シンプルで馴染みのある操作です。しかし、遅かれ早かれ、あまり需要のない値やプロパティをフォーマットして出力する必要がある状況が発生します。もちろん、MQL5のヘルプで調べることもできます。


しかし、場合によっては、MetaTrader 5ターミナルによって提供されるあらゆる種類の情報を表示するための、既製のレシピのコレクションがほしいことがあるでしょう。この記事では、PrintFormat関数の呼び出しの複雑さを理解し、コードに挿入するだけですぐに使えるようになるテンプレートを書いてみます。

作者: Artyom Trishkin

 

ありがとう。とても参考になりましたが、一読しただけでは...)))))

コードを書くときにヘルプを読むのは、何となく苦痛で時間がかかる。この記事でPrintFormat()とStringFormat()の微妙な使い分けがよく理解できるようになるといいのですが。

 
おそらく、ヘルプの中で唯一明らかにされていない点、つまり、データ・サイズ指定子(h | l | ll | I32 | I64)を指定しなくてもすべてが機能する場合、どのような場合に指定するのが本当に便利なのか、がカバーされていないのだろう。
 
JRandomTrader #:
おそらく、ヘルプでカバーされていない唯一の明白でない点は、データサイズ指定子(h | l | ll | I32 | I64)を指定することが、それなしですべてが動作する場合に本当に役立つ場合です。

次の例を見てほしい。

//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long x = (long)0xFFFFFFFF * 1000;

   Print("\nDEC: ",  typename(x)," x=",x,"\n---------");
   Print("%hu: ",  StringFormat("%hu",x));
   Print("%u: ",   StringFormat("%u",x));
   Print("%I64u: ",StringFormat("%I64u",x));
   Print("%llu: ", StringFormat("%llu",x));
   Print("\nHEX: ",  typename(x)," x=",StringFormat("%llx",x),"\n---------");
   Print("%hx: ",  StringFormat("%hx",x));
   Print("%x: ",   StringFormat("%x",x));
   Print("%I64x: ",StringFormat("%I64x",x));
   Print("%llx: ", StringFormat("%llx",x));

  }

結果

2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  DEC: long x=4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  ---------
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %hu: 64536
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %u: 4294966296
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %I64u: 4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %llu: 4294967295000
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  HEX: long x=3 e7fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  ---------
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %hx: fc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %x: fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %I64x: 3 e7fffffc18
2023.07.12 17:48:12.920 PrinFormat (EURUSD,H1)  %llx: 3 e7fffffc18
 
JRandomTrader #:
おそらく、ヘルプの中で唯一明らかでない点がカバーされていない。それは、データサイズ指定子(h | l | ll | I32 | I64)を指定しなくてもすべてが機能するのであれば、どのような場合にデータサイズ指定子を指定するのが本当に便利なのかという点である。

もちろん、それは機能する。しかし、つい数時間前、同じ疑問について考えていたところ、あることを思いついた。関数にダブル値だけを渡し、その内部で何らかの基準に基づいて、これらのダブル・データはロング・データであるべきだと理解したとする。ここでサイズを指定するのだ。単なる思いつきです。確認はしていない。

 

この数年間、printformatなしでどうやって生きてきたのだろう?おそらくこれからもそうするだろう。

 
Dmitry Fedoseev #:

この数年間、printformatなしでどうやって生きてきたのだろう?おそらくこれからもそうするだろう。

おそらく

 

アーテム、私はこれがどこから来たのか理解できない。

   uint w=(header_width==0 ? header.Length()+1 : header_width);

私はどのライブラリにも接続していない。それとも私は完全に盲目なのか?

 
Alexey Viktorov #:

アルテム、それがどこから来たのか理解できないよ

私はどのライブラリにも接続していない。それとも、私が完全に盲目なのか?

これは文字列変数と配列の標準機能です。

 
Artyom Trishkin #:

これは今や、文字列変数や配列に対する標準的な機能である。

ありがとう。でも、ドキュメントにはまったく何も書かれていません。どのような数値を返すのでしょうか。StringLen()と重複しているのでしょうか?

 
Alexey Viktorov #:

ありがとう。でも、ドキュメントにはまったく何も書かれていないんだ。どのような数値を返すのでしょうか。StringLen()と重複しているのでしょうか?

そうです。