'条件分岐 - 'GoTo' Kluge ? - ページ 3

 
FourX:

Raptorが調べた限りでは、MQL4にはGoSub/Returnコマンドのようなものはありませんし、そのような機能を作る能力もありません。そのため、MQL4でこの機能を実現するためのklugeを考え出そうとしているのです。

関数は GOSUB/RETURNと同じようなことをします。

start()
  {
  Print("About to call a function called, a_function . . .");
  a_function();                                               //  GOSUB
  Print("Just returned from a function called, a_function");
  return(0);
  } 
   
   
   
void a_function()
   {
   Print("a_function has been called . . . ");
   return;                                          // RETURN
   }
   
   
   
 
RaptorUK:

関数はGOSUB/RETURNと同じことをするのです。

しかし、MQL4にはGoSubやGoToのようなプログラム内の特定の場所、例えば185行目や特定のラベル/関数など、あなたが説明されたようなものはありません。そのサブルーチンの条件に応じて、サブルーチンやプログラムセクション/ファンクションを呼び出すことができます。あなたはGoSubを何年も使っているようですが、数行の連続したコードを条件付きでジャンプさせることは、全く同じことではありません。私は、私たちがすでに認識している、同じ機能を全く行わないこの区別について議論し続けることを望んでいません。したがって、この投稿です。GoSubは、例えば、プログラム内の以前の場所にジャンプして、必要な時に繰り返しコーディングするのではなく、プログラム内で既に確立された同じ必要な機能を再利用するような、真の「GoSub」の活用方法がまだ分かっていません。

参考までに、MetaEditorでテキストをコピーすると、約85%がクラッシュします。これは、多くの異なるMT4のインスタンス、多くの異なるコンピューター、3つの異なるバージョンのウィンドウズでの話です。MQL4を使用した32ビットと64ビットのシステムも含めていません。MT4は問題ないのですが、MQL4エディターはそうではありません。 したがって、コピー&ペーストは私にとって実行可能なオプションではありません。たとえそうであっても、GoSubやGoToのような機能を提供することはできません。

 

これは本当に意味があるのでしょうか?mql4はmql4であることは事実です。ですから、mql4でコーディングするときは、mql4のことを考えなければなりません。ある言語でコーディングするときに、異なる構造をサポートする別の言語でどう解決するかを考えることは意味がありません。もし、あなたがmql4でコーディングする際に、GoSub/ReturnとGoToを使うことでしか解決できないと思う問題があれば、私はそれを見てみたいのです。

 

FourX:

仮にそうだとしても、これでは「GoSub」や「GoTo」のような機能は提供できません。

申し訳ありませんが、MQL4関数と GOSUBが 違うというご指摘を理解するのにとても苦労しています。(Gotoは全く別物です。)

このGosubの件に限って言えば、です。MQL4関数はサブルーチン です。値を返すこともあれば返さないこともあります。サブルーチンの呼び出しはすべて、呼び出されたメインコードの次の行に戻ります。この点については、Raptorに100%同意します。

(上記のSDCの見解にも賛成です)。

 

このスレッドのポイントは、プログラム内の任意の場所への条件分岐、あるいは他のプログラムから外部への条件分岐が可能かどうかを確認することで、他の環境で提供されているようなプログラムモジュール/関数を繰り返し使用することです。MQL4がこれらを直接提供しないことは、すでに知っています。 このスレッドのポイントは 、この機能を実現するための「回避策(サブルーチン?)」などを作ることは可能 なのか、ということです。 概念的には、これはMQL4の'include'ファイルと類似しています。

MQL4デバッガーの限られた能力を補うために、GetLastError()関数の 値を'Alerting'または'Printing'しているのと同じようなワークアラウンドがあります。

これは、通常のMQL4関数のように、if, while, loop, continue, returnなどの条件付きブーリアン値を含んでいて、関数内でループバックしたり、先にスキップすることができるものではありません。 一度宣言すれば、その機能を必要とするプログラム内のどこででも、ほとんどの場合、何度でも使用することができます。環境によっては、fGoSubは、他のfSubRoutineを インポートして利用することができます。これは、特定の機能を実行するモジュールである別の小さなプログラムからの場合が多いです。 おそらく、MQL4の'Include'ファイルに多少似ています。

今はないからといって、この強力なプログラミング機能を「回避策」を作ることができるのであれば、利用するべきではないということでしょうか?

ご存知のように、同じ結果を得るために何かをプログラムする方法は数多く存在します。 これは、「あなたの問題を教えてくれたら、fGoToも fGoSubも 使わない方法を教えますよ」ということではないのです。 の一つなのです。もし、その機能を作ることができれば、プログラミングの柔軟性と能力が増し、いろいろな場面でいろいろな方法で活用することができるようになるのです。

 

mql4のカスタム関数が どのようなものであるかを理解していないようです ... なぜmql4のカスタム関数があなたが説明していることを正確に行わないのか、例を挙げてください。私はそうだと思います。私は他の多くのEA、インジケータ、スクリプトで再利用する関数をたくさん持っています。

start()をプログラムとして考えてみてください。その関数が終了すると、プログラムはカスタム関数が呼び出された行の次の行に戻ります ... ちょうどGOSUBのように。

 

FourX:

このスレッドのポイントは、プログラム内の任意の場所への条件分岐、あるいは他のプログラムから外部への条件分岐が可能かどうかを確認することであり、初期に述べたfGoToやfGoSubのような他の環境で提供されるようなプログラムモジュール/関数を繰り返し利用することです。

私は、他の環境から与えられた例のように、任意のプログラミングモジュール/関数を、しばしばプログラムの(ずっと)早い段階から繰り返し再利用できるような機能を提供することを求めているのです。

Mql4は1990年頃の古いスタイルの言語です。しかし、gotoやgosubはさらに古く、1970年ごろに作られたものです。Mql4より古いプログラミングをする意味があるのでしょうか?それよりも、C#のような本物のプログラミング言語を、DLLを通して使う方がずっといい。1990年代から2000年代にかけての発明(クラス、インターフェース、オブジェクト、イベントやリスナーなどのデザインパターン、テスト駆動プログラミングなどのプログラミング手法など)のほとんどは、コードの繰り返しを防ぎ、再利用可能で信頼性が高く読みやすいコードを素早く書くためのものです。私は、このgotoプロジェクトは すべて忘れた方がいいと思います。
 
FourX:

しかし、MQL4には、GoSubやGoTo185行目、特定のラベルや関数など、プログラム内の特定の場所に 移動するようなものはありません。そしてそれを実行し、その関数が呼び出されたプログラムの場所に戻ってください。

関数 内でreturnを使用すると、その関数が呼び出された場所に戻ります。これは、昔のgosub/returnの100%代用です。さらに、関数は値を渡したり返したりすることができ、独自の名前空間とスタックフレームまで持っているので、グローバル変数の混乱ももう必要ありません。私はあなたの問題を本当に理解していません。あなたが実際にやりたいことの具体的な例(たぶん疑似コードかBASICで)を提示してください。同じ例を、if/else、switch/case、関数呼び出しを使って、より明確で再利用性と保守性のある方法で行う方法をお教えします。

唯一本当に欠けているのは例外です。例外をシミュレートしようとしているのでしょうか?GOTOでこれを行うことはできません。また、これを行うには、コールスタックを適切に管理する必要があります(そして巻き戻す必要があります)。

同じ関数内で複数のreturn文を持つことができますし、breakでループから抜け出すこともできます。これは構造化言語におけるGOTOに最も近いもので、これらのこと(複数の終了)はすでに一部の厳しい純粋主義者によって嫌われています。

 
erzo:
C#のような本物のプログラミング言語をDLLで使用する方がずっと良い。

C#は、このフラットで低レベルなC言語呼び出し規則のAPIと相互作用するDLLを作るにはお勧めしません。C#は、他のC#や様々なマイクロソフトのものとやり取りしたい場合には完璧ですが、他の環境ほど汎用的ではありません。非常に特殊な環境です。

もしあなたが、最新のプログラミング言語で、C言語の呼び出し規則と簡単にインターフェースできるDLLを作りたいなら、ObjectPascal (Free Pascal) か Delphi をお勧めします。

 
7bit:

C#は、このフラットで低レベルなCの呼び出し規約APIと相互作用するDLLを作成することは推奨されません。

javaの方が良く知っているし、使おうと思ったのですが、なかなか橋渡しができません。しかし、C#を勧めないのであれば、その方が簡単だと思ったので、javaを試してみようと思います。(Pascalは私のスタイルではありません。) アドバイスありがとうございました!