ShortArrayToString関数の働き・役割
ShortArrayToString関数は、MQL5でushort型の配列を文字列に変換するための関数です。
この関数を使用することで、配列内の各シンボルコードを対応する文字に変換して1つの文字列として扱うことができます。
これにより、複数のUnicodeシンボルを連結した文字列を簡単に生成できます。
Unicodeシンボルコードとは?
Unicodeシンボルコードとは、Unicode標準で定義されている文字の一意(1つしか存在しない)のコードポイントです。
これにより、世界中の文字やシンボルを統一された形式で扱うことができます。
※Unicodeについての詳細は↓の記事をご参照ください。
MQL5では、ushort型でUnicodeシンボルコードを扱います。
具体例として、Unicode番号U+0041は’A’、U+0042は’B’、U+2665は’♥’を表します。
U+の後に続く4桁の16進数がUnicodeシンボルコードを示しています。
※16進数についての詳細は↓の記事をご参照ください。
文字列とは?
文字列とは、文字の並びを意味し、プログラム内でテキストデータを扱うために使用されます。MQL5では、string型で文字列を扱います。文字列は、ユーザーへのメッセージ表示、ログ出力、ファイルの読み書きなど、多くの場面で利用されます。
ShortArrayToString関数の引数について
string ShortArrayToString(const ushort &arr[], int start = 0, int count = -1);
第1引数は変換したいushort型の配列を指定します。この配列内の各要素がUnicodeシンボルコードでなければなりません。
第2引数は配列内のコピー開始位置を指定します。この引数は省略可能で、初期値は0です。配列のどこから変換を開始するかを指定します。
第3引数は複製する配列の要素数を指定します。この引数も省略可能で、初期値は-1です。-1は、配列の最後まで、または終了するまで複製することを意味します。
ShortArrayToString関数の戻り値について
ShortArrayToString関数は文字列型を返します。指定された配列内の各シンボルコードを文字に変換し、それらを連結した1つの文字列を返します。
ShortArrayToString関数を使う際の注意点
ShortArrayToString関数を使用する際には、配列内の各シンボルコードが有効なUnicodeコードポイントであることを確認してください。無効なシンボルコードが含まれている場合、予期しない結果になることがあります。
ShortArrayToString関数を使ったサンプルコード
以下に、ShortArrayToString関数を使用した具体的なサンプルコードを示します。このサンプルコードは、ushort型の配列を文字列に変換してエキスパートログに出力します。
// OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出されます
void OnStart()
{
// ushort型の配列を定義します
ushort unicodeArray[] = {0x0041, 0x0042, 0x0043, 0x2665};
// ShortArrayToString関数を使用して、配列を文字列に変換します
string resultString = ShortArrayToString(unicodeArray, 0, ArraySize(unicodeArray));
// 変換結果をエキスパートログに出力します
Print("配列を文字列に変換: ", resultString);
// 出力結果: "配列を文字列に変換: ABC♥"
}
サンプルコードに使われた関数や文法要素の簡単な解説
OnStart関数はスクリプトの実行が開始されたときに自動的に呼び出される関数です。この関数内で初期化処理やメイン処理を行います。
ushort型は符号なし短整数を表すデータ型です。0から65535までの範囲の数値を扱うことができます。
ShortArrayToString関数はushort型の配列を文字列に変換する関数です。変換後の文字列は、ログ出力やユーザー表示に利用されます。
ArraySize関数は配列のサイズを返す関数です。この関数を使用して、配列内の要素数を取得します。
Print関数は指定した文字列をエキスパートログに出力する関数です。デバッグや情報表示に使用されます。
公式リファレンスのサンプルコードについて
以下に、公式リファレンスのサンプルコードを示し、その挙動について初学者の方向けに解説します。
#define ROW_SIZE 16
ushort ExtShortArray[] = {
0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, 0x2198, 0x2199, 0x219A, 0x219B, 0x219C, 0x219D, 0x219E, 0x219F,
0x21A0, 0x21A1, 0x21A2, 0x21A3, 0x21A4, 0x21A5, 0x21A6, 0x21A7, 0x21A8, 0x21A9, 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21AE, 0x21AF,
0x21B0, 0x21B1, 0x21B2, 0x21B3, 0x21B4, 0x21B5, 0x21B6, 0x21B7, 0x21B8, 0x21B9, 0x21BA, 0x21BB, 0x21BC, 0x21BD, 0x21BE, 0x21BF,
0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21C4, 0x21C5, 0x21C6, 0x21C7, 0x21C8, 0x21C9, 0x21CA, 0x21CB, 0x21CC, 0x21CD, 0x21CE, 0x21CF,
0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x21D4, 0x21D5, 0x21D6, 0x21D7, 0x21D8, 0x21D9, 0x21DA, 0x21DB, 0x21DC, 0x21DD, 0x21DE, 0x21DF,
0x21E0, 0x21E1, 0x21E2, 0x21E3, 0x21E4, 0x21E5, 0x21E6, 0x21E7, 0x21E8, 0x21E9, 0x21EA, 0x21EB, 0x21EC, 0x21ED, 0x21EE, 0x21EF,
0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4, 0x21F5, 0x21F6, 0x21F7, 0x21F8, 0x21F9, 0x21FA, 0x21FB, 0x21FC, 0x21FD, 0x21FE, 0x21FF
};
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 7x16のシンボルテーブル内の文字列の数を計算する
int total = (int)ArraySize(ExtShortArray) / ROW_SIZE;
//--- テーブルの行ごとのループで、Unicode文字で各行に16個の7セットの矢印を行ごとに仕訳帳に表示する
for(int i = 0; i < total; i++)
{
int row = i * ROW_SIZE;
PrintFormat("Arrow set %u: %s", i + 1, ShortArrayToString(ExtShortArray, row, ROW_SIZE));
}
/*
結果:
Arrow set 1: ←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟
Arrow set 2: ↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯
Arrow set 3: ↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿
Arrow set 4: ⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏
Arrow set 5: ⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟
Arrow set 6: ⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯
Arrow set 7: ⇰⇱⇲⇳⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿
*/
}
各文法要素の解説
define ROW_SIZE 16 は、プリプロセッサディレクティブで定数を定義します。ここでは、1行に表示するシンボルの数として16を定義しています。
ushort ExtShortArray[] は、ushort型の配列で、Unicodeシンボルコードを格納しています。各コードは16進数表記されています。
OnStart関数 は、スクリプトの実行が開始されたときに自動的に呼び出される関数です。
int total = (int)ArraySize(ExtShortArray) / ROW_SIZE は、ArraySize関数で配列の要素数を取得し、それをROW_SIZEで割ることで行数を計算します。
タイプキャスト(int)は、ArraySize関数の結果を整数型に変換します。
for(int i = 0; i < total; i++) は、変数iが0からtotal-1まで1ずつ増加するループです。このループはtotal回実行されます。
int row = i * ROW_SIZE は、現在の行の開始インデックスを計算します。各行はROW_SIZE(16)個のシンボルを含むため、iにROW_SIZEを掛けています。
PrintFormat(“Arrow set %u: %s”, i + 1, ShortArrayToString(ExtShortArray, row, ROW_SIZE)) は、フォーマットされた文字列をエキスパートログに出力します。フォーマット指定子%uは符号なし整数、%sは文字列を示します。ShortArrayToString関数は、指定された配列部分を文字列に変換します。
コメントブロック/* … */ は、期待される出力結果を示しています。各行に16個の矢印シンボルが表示されます。