トップ  >  MQL4リファレンス  >  基本  >  データ型  > 型変換・キャスト
スポンサーリンク
検索

↑の検索エンジンが表示されない人は、
↓の古い検索エンジンを使用して下さい。
カスタム検索
MQL4リファレンスツリー
型変換・キャスト



使用している型を別の型に変換(キャスト)する必要がよく発生します。
但し、全ての型が別の型に変換できるわけではありません。

以下は、キャストのスキームです。
変換元の型 キャスト可能な型
char short
uchar short
ushort
short int
float
ushort uint
int
float
int long
double
float(データ損失の可能性有)
uint ulong
long
long float(データ損失の可能性有)
double(データ損失の可能性有)
ulong double(データ損失の可能性有)
float double
double 無し

char型の代わりにbool型を使う事が出来ます(両方とも1byteのデータ)。
またint型の代わりにcolor型を使う事が出来ます(両方とも4byteのデータ)。
long型の代わりにdatetime型を使う事が出来ます(両方とも8byteのデータ)。

データ損失の可能性が有るキャストは、変換元のデータが変換先の精度を超えた場合に発生します。
サンプルソース:
    int   tmp_int = 123456789;
    float tmp_float;
    
    tmp_float = (float)tmp_int;     // float型にキャスト(データ損失が発生)
    
    Print(tmp_float);               // 123456792.0表示

管理人の勝手なコメント:
#property strict無しの場合、
逆方向のキャスト(大きいサイズの型から小さいサイズへの型変換)を行ってもコンパイラは警告しません。
警告が出なくなるだけで不具合の原因となる問題は何も解決されていないので、
#property strictは絶対に削除しないで下さい。


上記スキームに記載されていないキャストを行う事は出来ますが、データ損失の可能性があります。
例えば、short型(2byteデータ)をchar型(1byteデータ)にキャストする場合等です。

また浮動小数点の値を整数型にキャストした場合は、小数点以下の値は常に削除されます。
小数点以下を意図的に切り捨てしたい場合は整数型にキャストで大丈夫ですが、四捨五入したい場合はMathRound()を使用します。
サンプルソース:
    double base_double = 9.8;
    double round_double;
    double mathround_double;

    round_double     = (int)base_double;        // intキャストによって小数点以下を切り捨て
    mathround_double = MathRound(base_double); // MathRoundによって四捨五入

    Print( DoubleToStr(round_double,1));       //  9.0表示
    Print( DoubleToStr(mathround_double,1));   // 10.0表示


2つの値が演算によって結合される時、演算実行前に優先順位に従ってより優先順位の高い方に変換されます。

◆優先順位

char(uchar,short,usrhot) ⇒ int ⇒ uinit ⇒ long ⇒ ulong ⇒ float ⇒ double



右に行く程優先順位が高い。
char,uchar,short,ushort型は無条件でint型に変換されます。
サンプルソース:
    char   tmp_char=3;
    double temp_double;

    //--- 整数変換の例
    temp_double = tmp_char/2   + 0.3;      // tmp_char/2の演算は一時的にint型にキャストされて行われる
    Print(temp_double);                   // 1.3表示
    
    //--- 浮動小数点数変換の例
    temp_double = tmp_char/2.0 + 0.3;      // tmp_char/2.0の演算は一時的にdouble型にキャストされて行われる
    Print(temp_double);                   // 1.8表示


整数変換の例では、除算の演算に使用した定数の値が2(int型)なので、演算の対象となるchar型のtemp_charは一時的にint型にキャストされます。
int型の整数除算なので3/2の結果は小数点以下が切り捨てられ、1になります。そしてその演算結果の型もint型です。

浮動小数点数変換の例では、定数の値が2.0(double型)なので、一時的にdouble型にキャストされます。
double型の浮動小数点数除算なので3/2の結果は、1.5になります。





明示的なキャスト


書式:
(型)式


サンプルソース:
    char   tmp_char=3;
    double temp_double;

    //--- 明示的キャストの例
    temp_double = (double)tmp_char/2   + 0.3;  // tmp_char/2の演算は明示的にdouble型へキャストして行う
    Print(temp_double);                       // 1.8表示
    

除算演算が行われる前にchar型のtemp_charは一時的にdouble型に明示的キャストします。
double型の整数除算なので整数定数の2はdouble型の2.0にキャストされます。
結果(double)tmp_char/2の演算結果は1.5になります。


キャストは単項演算です。
キャストによって演算結果が型の範囲を超える場合があります、その場合型のサイズに収まらないbitは切り捨てられます。
サンプルソース:
    int tmp_int;

    tmp_int = (char)400;               // 400(0x190)
    Print(tmp_int);                    // -112(0x90)表示

    tmp_int = (uchar)400;
    Print(tmp_int);                    // 144(0x90)表示

代入時の暗黙的キャスト

演算(代入演算子以外)が行われる前に、データは優先順位の最も高い型に変換されます。
代入演算が実行される前に、データはキャストされます。
サンプルソース:
    int    i=1/2;        // 暗黙的キャストは無い。結果は0

    int    k=1/2.0;      // 初めにdouble型にキャストされるが、演算結果がint型にキャストされるので結果は0

    double d=1.0/2.0;    // 暗黙的キャストは無い。結果は0.5

    double e=1/2.0;      // 初めにdouble型にキャストされ、演算結果が同じdouble型へ代入されるので結果は0.5

    double x=1/2;        // 初めにint型にキャストされるので演算結果は0
                      // 0の値がdouble型にキャストされ代入されるので結果は0






文字列(string)のキャスト

文字列型は最も高い優先順位を持ちます。
演算処理に文字列型がある場合、文字列型以降は自動的に文字列型にキャストされます。
サンプルソース:
    string temp;

    temp = 1 + 1;
    Print(temp);                        // "2"を表示

    temp = 1 + 1 + "str" + 1 + 1 + 1;    // "str"以降のデータはstringキャストされる
    Print(temp);                        // "2str111"を表示


単純な構造体のキャスト

単純な構造体のデータは構造体メンバが全てが数値で構成されます。
単純な構造体を他の単純な構造体へ代入する場合、メンバのキャストは行われず単純にコピーされます。
異なるサイズの構造体であれば、より少ないサイズのbyte数だけコピーされます。
サンプルソース:
struct st_1  {
    char    st1_char;
};

struct st_2  {
    short     st2_short;
};

struct st_3  {
    int     st3_int1;
    int     st3_int2;
};


int OnInit(){

    st_1 s1;
    st_2 s2;
    st_3 s3;
    
    s1.st1_char= 2;
    s2=s1;
    Print( s1.st1_char , " " , s2.st2_short);   // 2 2表示
    
    s3=s2;
    Print( s3.st3_int1, " " , s3.st3_int2);     // 2 0表示
    
    return 0;
}






スポンサーリンク
スポンサーリンク


Copyright ©2015 MT4でEA自作しちゃお~ All Rights Reserved.


Top

inserted by FC2 system