改めて前回の内容をおさらいをしておくと、
ということをお伝えしました。
今回は タイプキャスト(型変換) について解説していきたいと思います。
※MQL5で自動売買プログラム作るにあたっては、MT5・メタエディター5がお使いのパソコンにインストールされている必要があります。
もし、まだメタトレーダー5のダウンロードが完了していない方は、
こちらからデモ口座の開設とMT5のダウンロード・インストールを完了して頂ければと思います。
タイプキャスト(型変換) とは?
あるデータ型の値を、異なるデータ型に変換するプロセスのことです。
もっと具体的に言えば、例えば最初は整数型(int型)だった値を実数型(double型)にしたり、逆に実数型(double型)を 整数型(int型)にしたり・・・
といった処理のことを指します。
・・・例によって「何を言っているんだコイツは( 一一)」
と思われる方もいるかもしれません。
順を追って説明していきます。
タイプキャスト(型変換)を行う意味
そもそも
最初は整数型(int型)だった値を実数型(double型)にしたり、逆に実数型(double型)を 整数型(int型)にしたりする処理
をなぜしなければいけないのでしょうか?
現実の世界でも、モノを動かすときに気を付けないと破損したり、紛失したりすることがありますよね?
それと同じで、MQL5においてもデータ型をコピーしたり、変数に格納したりするときに、データ型に気を配らないとデータ自体が一部ロストしてしまったり、コピーができなかったりする事が発生します。
タイプキャスト(型変換)はそういったことを防ぐために行われます。
例えば、↓の記事で過去に「int以外の整数型」について書きました。
この記事の中では、同じ整数型でも格納できる範囲によって、int以外に、char,short,long などの データ型が使われる、ということを解説しているのですが、
void OnStart()
{
//ucharをデータ型にした変数「charInteger」を宣言
uchar charInteger;
//変数「charInteger」に「300」を代入
charInteger=300;
//ログ出力
Print(charInteger);
}
ucharは整数型ではありますが、0 から 255 までの値しか格納できません。
このコードをコンパイルすると↓
「truncation of constant value」
という警告(warning)がでます。意味としては
「定数値の切り詰めが発生しています」
ということです。有り体に言えば
「正しい数値じゃなくなっている可能性あるよー」と言っているんですね。
※警告(warning)は、コンパイルエラーではないので、MQL5 Program Fileは生成されるものの、プログラムが意図した動作をしない可能性がある記述をしているときにメタエディター側で発するメッセージです。
このコードを実行してみると・・・
本来「300」という数値だったのに、ログ出力してみたら44になってしまいました。
これは格納レンジの小さいデータ型に、それを超える大きい整数値を代入しようとしたときの例です。他にも異なるデータ型の変数に、値を代入しようとしても起こります。
void OnStart()
{
//intをデータ型にした変数「Integer」を宣言
int Integer;
//変数「Integer」に「145.6」を代入
Integer=145.6;
//ログ出力
Print(Integer);
}
↑変数「Integer」はint型ですが、代入しようとしている値「145.6」は小数点以下の値を持つ実数なので、本来はdouble型の変数を用意しなければいけません。
このコードをコンパイルするとやはり、
「truncation of constant value」
という警告(warning)がでてしまいます。
プログラムを実行すると・・・
本来「145.6」だった数値が、少数点以下が切り捨てられて「145」という形で、ログ出力されました。
int型の変数なので、小数点以下の値を保有することはできない、という訳です。
じゃあ、こんな場合はどうでしょう?
void OnStart()
{
//intをデータ型にした変数「intInteger」を宣言
int intInteger;
intInteger=100;
//ucharをデータ型にした変数「ucharInteger」を宣言
uchar ucharInteger;
//変数「ucharInteger」に「intIntegerすなわち100」」を代入
ucharInteger=intInteger;
//ログ出力
Print(charInteger);
}
先述した通り、ucharは整数型でかつ、0-255までの値を格納できるので、int型の変数「intInteger」の持つ値「100」を代入しても、なにも問題ない様に思えます。
コンパイルしてみましょう。
コンパイルエラーは発生しませんでしたが、
「possible loss of data due to type conversion from’int’ to ‘uchar’」
という警告(warning)がでてきました。これは
「int型変数のデータをuchar型変数に入れてしまっているから、データを失ってしまうかもしれません」
ということを言っています。
プログラムを実行すると・・・
特に問題なく、「100」がログ出力されていますね。
つまり
「pssible loss of data due to type conversion from’int’ to ‘uchar’」
の警告は、「必ず起こるわけではないけど、構造的に起こりうる問題点」
を指摘しているわけです。そしてその構造的に起こり得る問題点を解消する為にタイプキャスト(型変換)という処理が存在します。
話が長くなりましたが、次はタイプキャスト(型変換)のやり方をみていきましょう。
タイプキャスト(型変換)のやり方
タイプキャスト(型変換)のやり方の基本は以下のようになります。
//int型変数に入っていたデータをuchar型にキャストする
ucharInteger=(uchar)intInteger;
手順を文章にすると、
データ変換したい変数や、値、数式の前に()で括った変換先のデータ型を記述する
ということになります。
このコードをコンパイルすると・・・
先ほど出ていた警告が消えました。
double型に格納されている値をint型に代入する場合もみてみましょう↓
void OnStart()
{
//intをデータ型にした変数「intInteger」を宣言
int intInteger;
//realNumをデータ型にした変数「realNum」を宣言
double realNum=100;
//変数「realNum」に「intIntegerすなわち100」」を代入
intInteger=realNum;
//ログ出力
Print(intInteger);
}
異なるデータ型に値を代入しようとしているので、この場合もpssible loss of data~警告がでてしまいます。
タイプキャストして修正するには・・・
//double型変数に入っていたデータをint型にキャストする
intInteger=(int)realNum;
データ変換したい変数「realNum」の前に()で括った変換先のデータ型(int)を記述しました。
これでコンパイルすると警告は消えます。
これがタイプキャスト(型変換)の基本なのですが、MQL5にはタイプキャスト(型変換)を行ってくれる関数もあらかじめ用意されいます。
EnumToString関数という関数が出てきました。この関数もタイプキャスト(型変換)を行ってくれる関数の1つで、Enum列挙型から文字列型へのタイプキャスト(型変換)が行われていたのです。
まだ関数についての本格的な説明をしていないので、タイプキャスト(型変換)を行ってくれる関数についての詳細は折に触れてこの先紹介していきたいと思います。
※関数とは・・・「より簡単、かつ効率的にプログラムを動かす記述」で掃除機や電気炊飯器のような家電みたいなもの、と今はお考え下さい。
関数についてより詳しく先に知りたい方は↓の記事をご覧ください。
※なおタイプキャストについてはこの先、以下の講座記事群でもサンプルコード内に登場するので、参考にして頂ければと思います。
<その他参照>
コメント