関数の参照渡しとは

通常ですと、関数の引数で渡した値は関数実行後も同じ値となります。

#property copyright "Copyright 2016, gogojungle"
#property link "http://labo.fx-on.com"
#property version "1.00"
#property strict
#property indicator_chart_window

int SampleFunction(int value){
value = value + 1;
return(value);
}

int OnInit(){
int a= 2;
int b = SampleFunction(a);
Comment("a:", a, "
", "b:", b);

return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]){

return(rates_total);
}

SampleFunctionは引数で渡された値に1を足して返す関数です。
引数に指定した変数aは関数の実行後も値は2のままです。


参照渡し


参照渡しという方法を使用すると引数に指定した変数の値が関数内の処理によって変化します。
参照渡しを使用するには関数の宣言時に引数名の前に&を付けます。

#property copyright "Copyright 2016, gogojungle"
#property link "http://labo.fx-on.com"
#property version "1.00"
#property strict
#property indicator_chart_window

int SampleFunction(int &value){
value = value + 1;
return(value);
}

int OnInit(){
int a= 2;
int b = SampleFunction(a);
Comment("a:", a, "
", "b:", b);

return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[]){

return(rates_total);
}

さきほどと同じ処理を参照渡しを使用して実行すると、引数で渡した変数aの値が変化します。
引数で渡した値が関数内で+1されているため、変数aも+1された値となって帰ってきます。


参照渡しの実例


参照渡しは関数から複数の結果を取得する際に便利です。
例としてドル単位の数値を円単位に変換する関数を作成します。
まずは参照渡しを使わずに作成してみます。

double USDToJPY(double usd){
double jpy = usd * iClose("USDJPY", 0, 0);
return(jpy);
}

引数として渡された値に、現在のドル円のレートをかけることで円に換算しています。
一見問題無さそうですがこの処理には1点問題があります。
ドル円のレート取得に使用しているiClose関数が正しくレートを返してくれるとは限らないのです。
例えばドル円のチャートを全く表示しておらずドル円のレートが全く取得していない場合や、ドル円の通貨ペア名が「USDJPY」ではなかった場合(USDJPYproなど)にはiCloseの結果が0となります。
もしiCloseの結果が0ですと、戻り値も0となりますので正しく計算ができたとは言えません。

そこで参照渡しを使用してこの関数を修正します。
関数の型をbool型に変更し、計算が正しく終了していればtrue、失敗している場合にはfalseを返します。
成功した場合の計算結果は、引数を追加して参照渡しで返すようにします。

bool USDToJPY(double usd, double &jpy){
if(iClose("USDJPY", 0, 0) > 0){
return(false);
}

jpy = usd * iClose("USDJPY", 0, 0);
return(true);
}

このように参照渡しを利用することで複数の結果を得ることができます。
TwitterでシェアFacebookでシェアGoogle+でシェアはてなブックマークに追加

TOPへ