関数呼び出し
関数呼び出しは、別個の演算子として使用することができ、特定の値を含意するプログラム内の任意の場所に検出されます(事前定義されたケースを除く)。 関数呼び出しの形式と実行規則には、標準(組み込み)関数とユーザー定義関数の両方が含まれます。
関数呼び出し形式
関数呼び出しは、関数名と渡されたパラメータのリストを括弧で囲んで構成されています。
1 |
<span class="notranslate"> Function_name <b>(</b> Parameters_list <b>)</b> //そのような関数呼び出し</span> |
関数呼び出しで指定された関数名は、実行のために呼び出す関数の名前と同じでなければなりません。 リストのパラメータはコンマで区切られています。 関数に渡されるパラメーターの量は制限され、64を超えることはできません。関数呼び出しでは、定数、変数、およびその他の関数呼び出しをパラメーターとして使用できます。 関数呼び出しで渡されたパラメータの量、型および順序は、関数の説明で指定された仮パラメータの量、型および順序と同じでなければなりません(例外はデフォルトのパラメータを持つ関数呼び出しです)。
1 2 3 4 5 |
<span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-identifier">Alf</span> <span class="hl-code">、</span> <span class="hl-identifier">Bet</span> <span class="hl-brackets">)</span> <span class="hl-comment">//関数呼び出しの例</span></span> <span class="notranslate"> <span class="hl-comment">// ここに:</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-comment">//呼び出された関数の名前</span></span> <span class="notranslate"> <span class="hl-identifier">Alf</span> <span class="hl-comment">//最初に渡されたパラメータ</span></span> <span class="notranslate"> <span class="hl-identifier">Bet</span> <span class="hl-comment">// 2番目に渡されたパラメータ</span></span> |
呼び出された関数がパラメータを渡すことを暗示していない場合、パラメータのリストは空として指定されますが、とにかく括弧が必要です。
1 2 3 4 |
<span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">()</span> <span class="hl-comment">//</span> <span class="hl-comment">例示的な関数呼び出し</span></span> <span class="notranslate"> <span class="hl-comment">// ここに:</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-comment">//</span> <span class="hl-comment">呼び出された関数の名前</span></span> <span class="notranslate"> <span class="hl-comment">//渡すパラメータはありません</span></span> |
プログラムがデフォルトのパラメータで関数を呼び出さなければならない場合、渡されたパラメータのリストを制限(短縮)することができます。 最初のデフォルトパラメータから始めて、パラメータのリストを制限することができます。 以下の例では、ローカル変数b、c、およびdにはいくつかのデフォルト値があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="notranslate"> <span class="hl-comment">//次のように記述された関数の場合:</span></span> <span class="notranslate"> <span class="hl-reserved">int</span> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-reserved">int</span> <span class="hl-identifier">a</span> <span class="hl-code">、</span> <span class="hl-reserved">bool</span> <span class="hl-identifier">b</span> <span class="hl-code">=</span> <span class="hl-reserved">true</span> <span class="hl-code">、</span> <span class="hl-reserved">int</span> <span class="hl-identifier">c</span> <span class="hl-code">=</span> <span class="hl-number">1</span> <span class="hl-code">、</span> <span class="hl-reserved">double</span> <span class="hl-identifier">d</span> <span class="hl-code">=</span> <span class="hl-number">0.5</span> <span class="hl-brackets">)</span></span> <span class="notranslate"> <span class="hl-brackets">{</span></span> <span class="hl-code"> </span> <span class="notranslate"> <span class="hl-code">演算子</span></span> <span class="hl-code"> </span> <span class="notranslate"> <span class="hl-brackets">}</span></span> <span class="notranslate"> <span class="hl-comment">// ..以下の呼び出しが許可されています:</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-identifier">Alf</span> <span class="hl-code">、</span> <span class="hl-identifier">Bet</span> <span class="hl-code">、</span> <span class="hl-identifier">Ham</span> <span class="hl-code">、</span> <span class="hl-identifier">Del</span> <span class="hl-brackets">)</span> <span class="hl-comment">//許可された関数呼び出し</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-identifier">Alf</span> <span class="hl-brackets">)</span> <span class="hl-comment">//</span> <span class="hl-comment">許可された関数呼び出し</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-number">3</span> <span class="hl-brackets">)</span> <span class="hl-comment">//</span> <span class="hl-comment">許可された関数呼び出し</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-identifier">Alf</span> <span class="hl-code">、</span> <span class="hl-number">0</span> <span class="hl-brackets">)</span> <span class="hl-comment">//</span> <span class="hl-comment">許可された関数呼び出し</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-number">3</span> <span class="hl-code">、</span> <span class="hl-identifier">Tet</span> <span class="hl-brackets">)</span> <span class="hl-comment">//</span> <span class="hl-comment">許可された関数呼び出し</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-number">17</span> <span class="hl-code">、</span> <span class="hl-identifier">Bet</span> <span class="hl-code">、</span> <span class="hl-number">3</span> <span class="hl-brackets">)</span> <span class="hl-comment">//</span> <span class="hl-comment">許可された関数呼び出し</span></span> <span class="notranslate"> <span class="hl-identifier">My_function</span> <span class="hl-brackets">(</span> <span class="hl-number">17</span> <span class="hl-code">、</span> <span class="hl-identifier">Bet</span> <span class="hl-code">、</span> <span class="hl-identifier">3、0.5</span> <span class="hl-brackets">)</span> <span class="hl-comment">//</span> <span class="hl-comment">許可された関数呼び出し</span></span> |
デフォルト値のないパラメータはスキップできません。 デフォルトのパラメータをスキップすると、後続のデフォルトのパラメータを指定する必要がありません。
1 2 3 4 5 6 7 8 9 10 |
<span class="notranslate"> // <span class="hl-comment">次のように記述された関数の場合</span> :</span> <span class="notranslate"> int My_function(int a、bool b = true、int c = 1、double d = 0.5)</span> <span class="notranslate"> {</span> <span class="notranslate">演算子</span> <span class="notranslate"> }</span> <span class="notranslate"> // .. <span class="hl-comment">次の呼び出しは</span> ошибочнымиです:</span> <span class="notranslate"> My_function()//禁止された関数呼び出し:デフォルトではない..</span> <span class="notranslate"> // ...パラメータはスキップできません(最初のもの)</span> <span class="notranslate"> My_function(17、Bet、0.5)//禁止された関数呼び出し:スキップされました..</span> <span class="notranslate"> // ..defaultパラメータ(3番目のパラメータ)</span> |
呼び出される関数は、あらかじめ定義された型の特定の値を返す関数と、値を返さない関数の2つのグループに分かれています。
ノンリターン関数呼び出しの形式
値を返さない関数の呼び出しは、別の演算子としてのみ構成できます。 コール関数演算子は ";"で終了します。 (セミコロン):
1 |
<span class="notranslate"> Function_name <b>(</b> Parameter_list <b>);</b></span> <span class="notranslate"> //ノンリターン関数呼び出しの演算子</span> |
1 2 |
<span class="notranslate"> <span class="hl-identifier">Func_no_ret</span> <span class="hl-brackets">(</span> <span class="hl-identifier">アルファ</span> <span class="hl-code">、</span> <span class="hl-identifier">ベータ</span> <span class="hl-code">、</span> <span class="hl-identifier">ガンマ</span> <span class="hl-brackets">)</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//関数呼び出し演算子の例</span></span> <span class="notranslate"> <span class="hl-comment">// ..値を返さない関数の場合</span></span> |
値を返さない関数を呼び出すための他の形式(技術)は提供されていません。
リターン関数呼び出しの形式
値を返す関数への呼び出しは、別の演算子として構成することも、特定の型の値が暗示されている場所のプログラムコードで使用することもできます。
関数呼び出しが別の演算子として構成されている場合は、 ";"で終了します。 (セミコロン):
1 |
<span class="notranslate"> Function_name <b>(</b> Parameter_list <b>);</b></span> <span class="notranslate"> //リターン関数呼び出しの演算子</span> |
1 2 |
<span class="notranslate"> <span class="hl-identifier">Func_yes_ret</span> <span class="hl-brackets">(</span> <span class="hl-identifier">アルファ</span> <span class="hl-code">、</span> <span class="hl-identifier">ベータ</span> <span class="hl-code">、</span> <span class="hl-identifier">デルタ</span> <span class="hl-brackets">)</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//</span> <span class="hl-comment">関数呼び出し演算子の例</span></span> <span class="notranslate"> <span class="hl-comment">// ..</span> <span class="hl-comment">値を返す関数用</span></span> |
関数呼び出しの実行規則
関数呼び出しは、実行のために同じ名前の関数を呼び出します。 関数呼び出しが別の演算子として構成されている場合、関数の実行後、関数呼び出しに続く演算子に制御が渡されます。 関数呼び出しが式で使用されている場合、関数が実行された後、関数呼び出しが指定されている式内の場所に制御が渡されます。 呼び出した関数が返す値を使用して、式の次の計算が実行されます。 |
他の演算子での関数呼び出しの使用は、これらの演算子の形式によって決まります。
問題20.次の条件が満たされているプログラムを作成する: - 現在の時刻が15:00を超える場合は、 'for'サイクルで10回の繰り返しを実行します。 - それ以外の場合は、6回の反復を実行します。 |
以下のスクリプトcallfunction.mq4の例を示します。演算子 'for'(Expression_1の一部として、演算子 'for'の形式に従って、演算子 'for'を参照)のヘッダーにある関数呼び出し、代入演算子( 代入演算子を参照)の右部分と演算子 'if-else'のヘッダ(条件の中で、演算子のif- else '、 条件付き演算子' if-else 'を参照)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<span class="notranslate"> <span class="hl-comment">/// ----------------------------------------------- ------------------------------------</span></span> <span class="notranslate"> <span class="hl-comment">// callfunction.mq4</span></span> <span class="notranslate"> <span class="hl-comment">//</span> <span class="hl-comment">コードは教育目的のみに使用する必要があります</span></span> <span class="notranslate"> <span class="hl-comment">。</span></span> <span class="notranslate"> <span class="hl-comment">// ------------------------------------------------ ------------------------------------</span></span> <span class="notranslate"> <span class="hl-reserved">int</span> <span class="hl-identifier">start</span> <span class="hl-brackets">()</span> <span class="hl-comment">//関数の説明start()</span></span> <span class="notranslate"> <span class="hl-brackets">{</span> <span class="hl-comment">// start()関数の開始</span></span> <span class="notranslate"> <span class="hl-reserved">int</span> <span class="hl-identifier">n</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//変数宣言</span></span> <span class="notranslate"> <span class="hl-reserved">int</span> <span class="hl-identifier">T</span> <span class="hl-code">=</span> <span class="hl-number">15</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//あらかじめ定義された時間</span></span> <span class="notranslate"> <span class="hl-reserved">for</span> <span class="hl-brackets">(</span> <span class="hl-reserved">int</span> <span class="hl-identifier">i</span> <span class="hl-code">=</span> <span class="hl-identifier">Func_yes_ret</span> <span class="hl-brackets">(</span> <span class="hl-identifier">T</span> <span class="hl-brackets">)</span> <span class="hl-code">;</span> <span class="hl-identifier">i</span> <span class="hl-code"><=</span> <span class="hl-number">10</span> <span class="hl-code">;</span> <span class="hl-identifier">i</span> <span class="hl-code">++</span> <span class="hl-brackets">)</span> <span class="hl-comment">//関数の使用</span></span> <span class="notranslate"> <span class="hl-comment">//.theサイクル演算子ヘッダー</span></span> <span class="notranslate"> <span class="hl-brackets">{</span> <span class="hl-comment">//ボディの 'サイクル'の開始</span></span> <span class="notranslate"> <span class="hl-identifier">n</span> <span class="hl-code">=</span> <span class="hl-identifier">n</span> <span class="hl-code">+</span> <span class="hl-number">1</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//反復カウンタ</span></span> <span class="notranslate"> <span class="hl-predfunc">アラート</span> <span class="hl-brackets">(</span> <span class="hl-quotes">「</span> <span class="hl-string">反復n =</span> <span class="hl-quotes">」</span> <span class="hl-code">、</span> <span class="hl-identifier">n</span> <span class="hl-code">、</span> <span class="hl-quotes">「</span> <span class="hl-string">i =</span> <span class="hl-quotes">」</span> <span class="hl-code">、</span> <span class="hl-identifier">i</span> <span class="hl-brackets">)</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//関数呼び出し演算子</span></span> <span class="notranslate"> <span class="hl-brackets">}</span> <span class="hl-comment">//</span> <span class="hl-comment">ボディの 'for'サイクルの</span> <span class="hl-comment">終わり</span></span> <span class="notranslate"> <span class="hl-reserved">return</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//終了関数start()</span></span> <span class="notranslate"> <span class="hl-brackets">}</span> <span class="hl-comment">//</span> <span class="hl-comment">関数の</span> <span class="hl-comment">終わり</span> <span class="hl-comment">start()body</span></span> <span class="notranslate"> <span class="hl-comment">// ------------------------------------------------ -------------------------------------</span></span> <span class="notranslate"> <span class="hl-reserved">int</span> <span class="hl-identifier">Func_yes_ret</span> <span class="hl-brackets">(</span> <span class="hl-reserved">int</span> <span class="hl-identifier">Times_in</span> <span class="hl-brackets">)</span> <span class="hl-comment">//</span> <span class="hl-comment">ユーザ定義関数の説明</span></span> <span class="notranslate"> <span class="hl-brackets">{</span> <span class="hl-comment">//ユーザー定義の関数本体の開始</span></span> <span class="notranslate"> <span class="hl-reserved">日時</span> <span class="hl-identifier">T_cur</span> <span class="hl-code">=</span> <span class="hl-predfunc">TimeCurrent</span> <span class="hl-brackets">()</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//での関数の使用</span></span> <span class="notranslate"> <span class="hl-comment">// ..代入演算子</span></span> <span class="notranslate"> <span class="hl-reserved">if</span> <span class="hl-brackets">(</span> <span class="hl-predfunc">TimeHour</span> <span class="hl-brackets">(</span> <span class="hl-identifier">T_cur</span> <span class="hl-brackets">)</span> <span class="hl-code">></span> <span class="hl-identifier">Times_in</span> <span class="hl-brackets">)</span> <span class="hl-comment">//</span> <span class="hl-comment">関数の使用</span></span> <span class="notranslate"> <span class="hl-comment">//演算子 'if-else'のヘッダ</span></span> <span class="notranslate"> <span class="hl-reserved">return</span> <span class="hl-brackets">(</span> <span class="hl-number">1</span> <span class="hl-brackets">)</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//戻り値1</span></span> <span class="notranslate"> <span class="hl-reserved">return</span> <span class="hl-brackets">(</span> <span class="hl-number">5</span> <span class="hl-brackets">)</span> <span class="hl-code">;</span></span> <span class="notranslate"> <span class="hl-comment">//</span> <span class="hl-comment">戻り値</span> <span class="hl-comment">5</span></span> <span class="notranslate"> <span class="hl-brackets">}</span> <span class="hl-comment">//</span> <span class="hl-comment">ユーザ定義の関数本体の終わり</span></span> <span class="notranslate"> <span class="hl-comment">// ------------------------------------------------ -------------------------------------</span></span> |
上の例では、以下の関数が、次の渡されたパラメータで呼び出されました:
- Func_yes_ret(T) - 変数Tを呼び出します。
- 関数Alert()への呼び出し - 文字列定数 "反復n ="と "i ="、変数nとi;
- TimeCurrent()関数は、渡すべきパラメータを提供しません。
- 関数TimeHour(T_cur) - 変数T_curを呼び出します。
このプログラムでは非常に単純なアルゴリズムが実現されています。 変数Tに、計算が行われる時間(時間単位)を設定します。 演算子 'for'のヘッダーでは、1つまたは5つの値のいずれかを返すことができるユーザー定義関数Func_yes_ret()への呼び出しを指定します。この値に応じて、サイクルの反復量が変更されます。 10(iが1から10に変化する)または6(iが5から10に変化する)のいずれかの反復が存在する。 ビジュアル化をより良くするために、サイクル本体では反復カウンタを使用します。反復カウンタは、関数Alert()を使用して各値が画面に表示されます。
ユーザ定義関数の記述では、最初に、1970年1月1日の00:00の後に経過した秒数(TimeCurrent()関数の呼び出し)を計算し、現在の時間を時間単位で計算しますTimeHour())。 アルゴリズムは演算子 'if'(関数TimeHour()の呼び出しがその条件で指定されている)を使用して分岐されます。 現在の時刻がユーザー定義関数(ローカル変数Times_in)に渡された時刻を超えている場合、後者は1を返し、それ以外の場合は5を返します。
ご注意ください:
プログラム内の関数start()の標準関数または関数呼び出しの記述はありません。 |
以下は、スクリプトcallfunction.mq4のブロック図です。
イチジク。 関数呼び出しを使用するプログラムのブロック図。
図の円は関数呼び出し(標準関数とユーザー定義関数)をマークします。 赤い矢印は、コントロールに関数が渡されていることを示し、逆も同様です。 この関数は、関数呼び出しが指定された場所に制御を戻すことが明確にわかります。関数呼び出しと関数自体の間のパスでは計算が行われません。 一般に、関数が値を返す場合、この値は呼び出し側モジュールに渡されます(関数呼び出しの方向に赤い矢印に沿って)。
特別な関数は、他の関数と同じように、一般的な規則に従ってプログラム内の任意の場所から呼び出すことができます。 特別な関数はパラメータを持つこともできます。 ただし、クライアント端末がこれらの関数を呼び出すと、外部からパラメータが渡されず、デフォルト値が使用されます。 特殊関数でのパラメータの使用は、プログラムから呼び出された場合にのみ合理的です。 MQL4では、プログラムから特別な関数を呼び出すことは技術的に可能ですが、そうすることはお勧めできません。 特別な関数呼び出しを使用するプログラムは、間違っているとみなされます。