【超入門】MQL5 EA講座 第43回「値渡しについて」【EAの作り方】

MQL5でEA作ろう講座

前回は return演算子 について解説しました。

改めて前回の内容をおさらいをしておくと、

ということをお伝えしました。

今回は 値渡し についてお話ししたいと思います。

値渡し次回取り上げる参照渡しと対になっている概念になります

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

値渡し・参照渡し とは?

値渡し参照渡しという、この謎の言葉たちなんですが(「値」を渡すは、100歩譲るとして、「参照」を渡すってなんだよ(; ・`д・´))

今回と次回の話(値渡し参照渡し)というのは、関数の使い方に関連したものです。

※この講座もだいぶ、回数を重ねてきましたが、関数については大丈夫でしょうか?

関数について復習されたい方は、↓の記事をご覧ください。

関数の書式構造をもう一度おさらいしておくと、↓

データ型 関数名 (引数1,引数2,引数3・・・)
{
     //処理記述
}

こんな感じになっていましたね?

引数というのは?・・・関数のパラメーターのことです。

値渡しであったり、参照渡しというのは、この

引数(パラメーター)の記述方法の種類

だと思ってもらったら結構です。

引数についての前提

関数の各引数(パラメーター)にはデータ型が設定されていて、関数を使う際には、引数に設定されている種類のデータを記述しなくてはいけません。

洗濯機がもし関数だったとして、洗濯槽に入れるのはもちろん衣類ですよね。(電子レンジのように食べ物を温めようと食材をぶち込んだら壊れるか大惨事になるかのどちらかです)

「第1引数にはint型を入れてくださいねー、第2引数にはdouble型を入れてくださいねー」

という決まりが、組み込み関数であれば事前に設定されていますし、自分で関数を作るときにもその設計はしなくてはいけません。

引数を設定せず()内に何も入力しない場合は別ですが、関数宣言時にデータ型を指定しないで変数を入力すると

「 declaration without type 」(和訳:データ型がない状態で宣言しています)

というコンパイルエラーが発生します。↓

引数(パラメーター)には、定められたデータ型に従った値(を格納している変数や、それを算出する式や関数など)を入れる

まずはこの前提を押さえたうえで、この先を読み進めてもらえたらと思います。

値渡しについて

繰り返しになりますが、値渡しというのは、

関数引数(パラメーター)に、値のコピーを渡す記述方法の1つになります。

コピーなので、関数内での処理がどのようなものであれ、元々の値には一切影響がありません。

void OnStart()
  {   
     string varString="こんにちわー";
     
    //exampleFuncton関数を呼び出し、実引数にvarStringを設定
    exampleFuncton(varString);
   
    
     
  }
  
  //関数「exampleFuncton」を宣言し、仮引数を文字型「passingByValue」に設定
  void exampleFuncton(string passingByValue)
  {
      //仮引数「passingByValue」に"こんばんわー"を代入
     passingByValue="こんばんわー";
     
     //ログ出力
     Print(passingByValue);
  }

順を追ってみていきましょう。

まず関数の宣言と実装部分ですが、

void型戻り値なし)のデータ型で、関数名が「exampleFuncton」となっています。

引数(パラメーター)には、string型を設定し、引数の名前は「passingByValue」としました。

仮引数について

引数については、第25回「関数について」 の補足欄にも書いてあります。

関数を宣言する時に、設定する引数のことですね。

あくまで実際に関数を使う際の、ガイダンスとして設定しているもので、実際にイベントハンドラーなどのメインプログラムで関数を呼び出すときに関数の()内に記述する値を引数といいます。

サンプルコードで言えば、

引数関数宣言時に記述した「passingByValue」

引数OnStart関数内で記述した「varString(=そこに格納されている”こんにちわー”)」

となります。

void exampleFuncton(string passingByValue)//←これは仮引数
//------------------------------------------------------------
 string varString="こんにちわー";
     
    
    exampleFuncton(varString);//←これは実引数

宣言した「exampleFuncton」関数にどのような機能を付与したかを改めて確認していきましょう。

void exampleFuncton(string passingByValue)
  {
      //仮引数「passingByValue」に"こんばんわー"を代入
     passingByValue="こんばんわー";
     
     //ログ出力
     Print(passingByValue);
  }

以上の機能を持った関数になります。

OnStart関数内でよびだした「exampleFuncton」関数の()内には、string型(文字列型)の値(実引数)が必要ですから、変数「varString」を記述しました。

変数「varString」には、初期値として”こんにちわー”が格納されています。

このMQL5 Program Fileをチャートに挿入して実行してみると・・・

???「こんばんわー」とログ出力されていますね。

「exampleFuncton」関数の()内には、“こんにちわー”が格納されている変数「varString」を記述しているはずなのに・・・

でも、なにも不思議なことはないんです。

「exampleFuncton」関数の役割は

でしたよね?

もっと簡単に言えば“こんばんわー”とログ出力するための関数なわけです。

つまり、

変数「varString」に格納されている文字列が”こんにちわー”だろうと”馬鹿野郎ー”だろうが、

「exampleFuncton」関数を呼び出せば、”こんばんわー”としかログ出力されない。

ということです。

↑イチゴを入れてもオレンジジュースが作られる図・・・

それでは、変数「varString」に格納していた初期値“こんにちわー”はどうなっているのでしょうか?

“こんばんわー”に変わっているのでしょうか?↓

Print関数でvarStringをログ出力してみると、初期値“こんにちわー”がログ出力されていますね。

なぜこのような挙動になるかというと、

最初にお伝えした通り、値渡しの場合、引数に元のデータのコピーを渡して関数を動かしているので、元のデータ(今回の場合、変数「varString」に格納していた初期値“こんにちわー”)には一切影響がないんです。

これが値渡しの基本的な考えで、かつ関数を呼び出すときの多くがこの値渡しによって引数が記述されます。

値渡しだけでそこそこの長さになってしまったので、もう一つの引数記述方法である参照渡しについては次回に解説したいと思います。

まとめ

イチゴを入れてもオバナナを入れてもレンジジュースが作られる機械・・・

今回は 値渡し について解説しました。

今回の記事では以下のことを学びました。

  • 値渡しは、関数引数(パラメーター)に、値のコピーを渡す際の記述方法の種類である。

  • コピーを渡しているので、関数内での処理がどのようなものであれ、元々の値には一切影響がない。

今回は以上になります。

最後までお読みいただきありがとうございました<m(__)m>

【超入門】MQL5 EA講座 第42回「return演算子について」【EAの作り方】

        →【超入門】MQL5 EA講座 第44回「参照渡しについて」【EAの作り方】

コメント

タイトルとURLをコピーしました