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

 
RaptorUK:
BBCベーシックの時代にはGOTOを使っていましたしね。BBC BasicにはGOSUBとRETURNがあり、サブルーチン(関数)を使用することができました。

ラプターさん、こんにちは。

ご自身でもおっしゃっているように、このようなものを何年も使っておられるので、非常に便利な活用法が無数にあることをご存じなのでしょう。GoSub」と「Return」機能は、基本的に私が言っている「GoTO」と同じ考えです。ただし、GoSub/RETURN関数では、呼び出したプログラムの同じポイントに戻らなければならない。GoToとは異なり、そうしないと非常に混乱した悪夢を作り出すことになります。MQLのInclude、Library、.dllファイルの使用容量もこれに近いと思いますが。しかし、これではGoSub/RETURNなどで得られるような制御はできません。

コンピュータ加工用のプログラミングの多くの反復には、GoSub/RETURNのペアも含まれており、その環境ではかなりの有用性を持っています。高度なモジュール化、多数の標準的な「定型サイクル」、およびカスタムや特殊な関数を多数のプログラムで何度も再利用することが可能です。必要なたびに車輪を「再発明」する必要がないのです。私がコンピュータ加工のプログラミングを請け負うようになったとき、2,000を超える異なるCNCコントローラに直面しました:すべてのコントローラには独自のプログラミングのバリエーションがあります。私は、ソフトウェアが生成するよりも、より少ないサイクルタイムでより良い結果を出し、より良い工具の摩耗をもたらす、より効率的なものを自分で書くことがよくできました。

 

GOSUB/RETURNはMQL4で関数を 使うのと同じだ

何年も前に少しCNCプログラミングをしたことがあるのですが ... ...主にAeroSpaceの仕事。

 
FourX:

Cにはないと思うのですが......?

はい、そうです。K&R 第2版の65ページに載っています。この本では使わないと言って おきながら、次のページで例を挙げていますよ。

 

ここで模倣しようとしているのは

dog:

cat:

mouse:

   if( bizarre_condition1 ){
      goto cat;
   }

   if( bizarre_condition2 ){
      goto mouse;
   }

   goto dog:

このようにすることができます...

while(true){
   
   // dog:
   if( GOTOstate == DOG ){
   }
   
   // cat:
   if( GOTOstate == DOG || GOTOstate== CAT ){
   }
   
   // mouse:
   //no test needed here, just do MOUSE stuff
   
   
   if( bizarre_condition1 ){
      GOTOstate= CAT;
      continue;
   }

   if( bizarre_condition2 ){
      GOTOstate= MOUSE;
      continue;
   }
   
   GOTOstate = DOG;
}
   

しかし、特にたくさんのラベルを扱う場合には、あまりエレガントではありません。もっといい方法は

while(true){
   
   switch(GOTOstate){
      case DOG:
         // do DOG stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
      case CAT:
         // do CAT stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
      case MOUSE:
         // do MOUSE stuff
         break;
      default:
         break;     
   }
   
   if( bizarre_condition1 ){
      GOTOstate= CAT;
      continue;
   }

   if( bizarre_condition2 ){
      GOTOstate= MOUSE;
      continue;
   }
}

しかし、関数 呼び出しをswitch文の中に記述する必要があります。そうしないと、switchが 数ページにわたる場合、コードの構造がわからなくなります。

 
FourX:

SDCの皆さん、こんにちは。

ほとんどのプログラミングと同様に、MQL4は事実上すべての「関数」で、いくつかの行を飛び越える以外は、私がMQL4 EA内でどのように行うかを把握しようとしている真の「GoTo」関数を持っていません。したがって 、あなたが「同意」しているもの、この検索の文脈で何を意味し参照しているかが分かりませんか?拡大解釈して説明してください。論破されているわけではありません。何か思い当たる節があるようなので、それが何なのか、そしてそれがどのように私たちにとって有益なのかを知りたいのです。


こんにちは、FourXです。私が言いたかったのは、関数 呼び出しはGoToの考えを超越し、GoToに従うよりも関数に整理された方が後でコードを読むのが簡単であること、そしてdabblerが彼の例で示したように、スイッチを使った多方向分岐は複数のGoToと同じことを達成できる、という事実だけでなく、その作業性を向上させるものである、ということなんです。

 
dabbler:

ここで模倣しようとしているのは

このようにすることができます...

しかし、特にたくさんのラベルを扱う場合には、あまりエレガントではありません。もっといい方法は

しかし、switch文の中に関数呼び出しを入れる必要があります。そうしないと、switchが 数ページにわたる場合、コードの構造を見ることができません。


Dabblerさん、こんにちは。

GoTo」文や関数を使うと、次の式や文に飛ぶだけでなく、プログラム内の任意の場所にジャンプすることができます。このため、プログラム内の複数のインスタンスで必要とされる同じ関数を 再利用することができます。

そのため、柔軟性と利便性の両方を兼ね備えています。しかし、両刃の剣のように、MQL5で問題を起こすのは簡単で、悪夢のようなプログラムを作ることもあります。

MQL5には「GoSub/RETURN」や「GoTo」などがありますか?Visual Basic、Java、PHPなどではどうですか?

 
RaptorUK:

GOSUB/RETURNはMQL4で関数を使うのと同じだ

何年も前に少しCNCプログラミングをしたことがあるのですが.主にAeroSpaceの仕事です。

Raptorで調べた限りでは、MQL4にはGoSub/Returnコマンドやそのような関数を 作成する機能はありません。そのため、MQL4でこの機能を実現するための道具を考えています。

 
dabbler:

ここで模倣しようとしているのは

このようにすることができます...

しかし、特にたくさんのラベルを扱う場合には、あまりエレガントではありません。もっといい方法は

しかし、関数呼び出しをswitch文の中に記述する必要があります。そうしないと、switchが 数ページにわたる場合、コードの構造がわからなくなります。

MQL4 Reference - Basics - MQL4のシンタックスは、いくつかの特徴を除けば、C言語ライクなシンタックスです。

  • アドレス演算はありません。

  • 演算子 do ... while がない。

  • 演算子gotoなし ...;

  • 条件]?[式1]:[式2]の演算はありません。

  • 複合データ型(構造体)がない。

  • 例えば,val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; 等のような複雑な代入はできない.

  • 論理式の計算は常に終了し、早期終了することはない。

 

1withZachyさん、こんにちは。

要するに、これはMQL4のSOPで、実際には標準またはカスタム関数を利用し、その結果をMQL4が行うように関数に「返す」だけだと思われます。しかし、フロー図を見ると、私が見逃している微妙な違いがあるかもしれませんが、そうは思えません。しかし、提供されているサンプルコードのドキュメントを見ると、以下のように書かれています。CallFuntion.mq4'はロシア語で書かれており、私には全く理解できないのです。

 

WikipediaのGoToに関する 興味深い記事からいくつか抜粋してみました。

多くの言語がgoto文をサポートしていますが、そうでないものも多くあります。Javaでは、gotoは予約語 であるが、使用できない。[1][2] PHPでは、バージョン5.3までgotoのネイティブサポートはありませんでした(その機能をエミュレートするライブラリは利用可能でした)。[3]

構造化プログラムの定理 は、プログラムを書くのにgoto文は必要なく、シーケンス、選択/選択、反復/反復の3つのプログラミング構成の組み合わせで、チューリング機械が 実行できるあらゆる計算を行うのに十分であることを証明した。

1960年代から1970年代にかけて、コンピュータ科学者はGOTOステートメントから「構造化プログラミングパラダイムを 支持するようになった。プログラミングスタイルの コーディング標準の中には、前述の構造化プログラムの定理を考慮し、GOTO文の使用を禁止しているものもあるどの? Böhm-Jacopiniの証明は、ソフトウェア開発に構造化プログラミングを採用するかどうかという問題に決着をつけませんでしたが、これは、この構成がプログラムを改善するというよりも、プログラムを不明瞭にする可能性が高かったことも一因です。

GOTOに対する最も有名な批判は、Edsger Dijkstraによる 1968年の手紙「Go To Statement Considered Harmful」です[5]。この手紙の中でダイクストラは、制限のないGOTO文はプログラム(特にループを含むもの)の正しさを分析・検証する作業を複雑にするので、高位言語から廃止されるべきだと主張した[5]。

これとは別の視点として、ドナルド・クヌースの構造化プログラミング with go to ステートメント[6]では、多くの一般的なプログラミング作業を分析し、そのうちのいくつかではGOTOが最適な言語構成 であることを見出している。