mt4 (MetaTrader4)使い倒シストレ

メタトレーダー、自作インジケータ、自作EAで完全自動売買。使えるものは何でも使え。
インジケーター、EA(自動売買システム)製作のご依頼はこちらへ
Googolyen FX Factory
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


にほんブログ村 為替ブログ FX システムトレード派へ
--/--/--(--) --:--:-- | スポンサー広告 | Trackback(-) | Comment(-)
参照渡しは、とても便利かも!
以前に書いた【グローバル変数を使わずに健康的に】の記事の中で
『参照渡し』を使ったコードを書いたところ、

「&」とは何を意味するのでしょうか?

というご質問をいただきました。
そこで、『参照渡し』についての解説と、便利に使える方法を
いくつかご紹介したいと思います。

まずは『参照渡し』についてです。

MQL4では、関数の引数の値をその関数内で変更しても
変数の値を変更することはできません。


どういうことかというと、案の定ですが…


以下のコードを見てください(笑)。

void func(int arg0) {
arg0++;
}

int start()
{
int param1 = 0;

func(param1);

Comment(param1);
}

func関数とstart関数を定義しました。

・func関数はarg0という引数を受け取り、arg0をインクリメント(1を加算)する関数です。
・start関数はparam1という変数を定義し、func関数を呼び出しています。

この時Comment関数によって表示される値は、
MQL4の仕様では、『0』のままなんです。

つまり
MQL4では、関数の引数【arg0】の値【0】をその関数内で変更【arg0++】しても
変数の値【param1】を変更することはできません【0のまま】。

ってことなんですね。

そこで『参照渡し』の登場です。
『参照渡し』を使えば、関数の引数の値をその関数内で変更した場合
変数の値を変更することができます。


使い方は簡単です。
関数宣言の引数名の前に「&」をつけるだけです。

void func(int &arg0) {
arg0++;
}

int start()
{
int param1 = 0;

func(param1);

Comment(param1);
}


今度はComment関数によって表示される値が『1』になります。
param1の値がちゃんとインクリメントされていますね。

つまり、
『参照渡し』を使えば、関数の引数【arg0】の値【0】をその関数内で変更【arg0++】した場合
変数の値【param1】を変更することができます【1になる!】。

ってことなんです。


これが『参照渡し』と呼ばれる方法です。
実はMQL4の標準関数にも、『参照渡し』は多用されています。
配列関数群の半分くらいに『参照渡し』が使われています。
(参照渡しは配列に使うこともできます)


int ArrayCopy( object&dest[], object source[], int start_dest=0, int start_source=0, int count=WHOLE_ARRAY)
int ArrayCopyRates( double&dest_array[], string symbol=NULL, int timeframe=0)
int ArrayCopySeries( double&array[], int series_index, string symbol=NULL, int timeframe=0)
int ArrayInitialize( double&array[], double value)
int ArrayResize( object&array[], int new_size)
bool ArraySetAsSeries( double&array[], bool set)
int ArraySort( double&array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND)


これはつまり、
この関数に渡した変数は、何かしら変化しますよ~。
ってことなんですね。
(ArrayResize関数は、渡した配列のサイズ(大きさ)を変更する関数です。)

『参照渡し』のイメージはつかめたでしょうか?

さて、続いて便利に使える方法です。

が…


次回につづく!!

にほんブログ村 為替ブログ FX システムトレード派へ
Comment
≪この記事へのコメント≫
参考にさせて頂いてます。
次回がとても楽しみです
2009/03/13(金) 20:36:42 | URL | poB #-[ 編集]
いつも参考にさせて頂いてます
基本がわかってない質問ですが・・
例えば(1)void func(int &arg0){処理}
と(2)int func(int arg0){処理~return(arg0)}
この2つ結果は同じと思うのですが、どう使い分ければよいのでしょうか?
2009/03/14(土) 11:11:22 | URL | pob #S2oozBqU[ 編集]
こんにちは!
毎度お世話になっております。

これまた興味深い記事ですなぁ。
と前回の記事を読んでみたら
質問した人よく見たら自分でした。

参照渡し。。。
う~ん。。。扱うの難しいかな。。
2009/03/19(木) 11:11:05 | URL | esu #-[ 編集]
Re: いつも参考にさせて頂いてます
>pobさん

こんにちは。
コメントありがとうございます!

ご質問頂いた件に関しては、
うまくご説明できるかわかりませんが、
また記事内にて書いてみようと思います。
2009/03/19(木) 17:46:09 | URL | googolyen #F7lUkdrY[ 編集]
>esu さん

こんにちは!

う~ん。。。書き方が分かり難かったかも知れませんね。。

2009/03/26(木) 16:58:23 | URL | googolyen #F7lUkdrY[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
Secret: 管理者にだけ表示を許可する
 
Trackback
この記事のトラックバックURL
≪この記事へのトラックバック≫
Designed by aykm.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。