連載

プロフェッショナルVB.NETプログラミング

第6回 論理演算と制御構造

(株)ピーデー
川俣 晶
2002/05/21

Page1 Page2

古い制御構造On…GoToとOn…GoSub

 筆者が最も使い込んだBASICは、1979年に発売されたパソコン、PC-8001に搭載されたN-BASICと、Visual Basicの1.0〜2.0なので、もしかしたらVB 6からVB.NETへの移行を解説するのに適任ではないかもしれない、と思うこともある。しかし、こういうトピックを解説するには、古いBASICを知っている者でなければならないので、やはり筆者が書く意味もあるのだろうか、とも思う。

 さて、On…GoToとOn…GoSubは、大昔のBASICに存在していた制御構造の構文である。Visual Basicが生まれる前にすでに使われなくなっていた非常に古いもので、ある意味で、これがVB 6でもまだサポートされていたのは驚きである。しかし、とうとうVB.NETではサポートが行われないことになった。恐らく、Visual BasicになってからBASICを学んだプログラマーなら、存在すら知らないのが普通だと思う。しかし、まれに古いソース資産を継承しながら使われてきたプログラムの中に、この構文が使われている可能性がないともいえないので、説明しておこう。

 まずは、この構文を使用したVB 6サンプルから見ていただきたい。

  1: Private Sub DemonstrateOnGoto(ByVal n As Integer)
  2:     On n + 1 GoTo a, b, c
  3: a:  Debug.Print "goto-a"
  4:     Exit Sub
  5: b:  Debug.Print "goto-b"
  6:     Exit Sub
  7: c:  Debug.Print "goto-c"
  8: End Sub
  9:
 10: Private Sub DemonstrateOnGoSub(ByVal n As Integer)
 11:     On n + 1 GoSub d, e, f
 12:     Debug.Print "On..GoSub終わり"
 13:     Exit Sub
 14: d:  Debug.Print "gosub-d"
 15:     Return
 16: e:  Debug.Print "gosub-e"
 17:     Return
 18: f:  Debug.Print "gosub-f"
 19:     Return
 20: End Sub
 21:
 22: Private Sub Form_Load()
 23:   Dim n As Integer
 24:   n = 0
 25:   While n < 3
 26:     DemonstrateOnGoto n
 27:     DemonstrateOnGoSub n
 28:     n = n + 1
 29:   Wend
 30: End Sub
On…GoToとOn…GoSubを使用したVB 6のサンプル・プログラム5

 これを実行すると以下のようになる。

 1: goto-a
 2: gosub-d
 3: On..GoSub終わり
 4: goto-b
 5: gosub-e
 6: On..GoSub終わり
 7: goto-c
 8: gosub-f
 9: On..GoSub終わり
サンプル・プログラム5の実行結果

 ソース2行目がOn…GoTo文である。これはOnの次の数式を計算し、GoToの後に列挙されたラベルから1つを選んでジャンプする(GoToを実行する)という機能を持つ。もし数式が1なら列挙されたラベルの1番目を、2なら2番目を、3なら3番目を呼ぶ。列挙されているリストに目的の番号に対応するものがなければ、次のステートメントを実行する。

 同様に、11行目がOn…GoSub文である。これは、GoToではなくGoSubを行う。GoSubはサブルーチン呼び出しを行う機能で、Return文で呼び出し元に戻る。引数や戻り値のない関数呼び出しのようなもの、と理解すればよいだろう。

 では、VB.NETではどう書くことになるのか、一応書いてみたのが以下のソースである。

  1: Private Sub DemonstrateSelectCase(ByVal n As Integer)
  2:   Select Case n
  3:     Case 0
  4:       Trace.WriteLine("case 0")
  5:     Case 1
  6:       Trace.WriteLine("case 1")
  7:     Case 2
  8:       Trace.WriteLine("case 2")
  9:   End Select
 10: End Sub
 11:
 12: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 13:   Dim n As Integer
 14:   n = 0
 15:   While n < 3
 16:     DemonstrateSelectCase(n)
 17:     n = n + 1
 18:   End While
 19: End Sub
On…GoToの代わりに“Select Case”を使用したVB.NETのサンプル・プログラム6

 これを実行すると以下のようになる。

 1: case 0
 2: case 1
 3: case 2
サンプル・プログラム6の実行結果

 On…GoToにせよ、On…GoSubにせよ構造化構文ですらない構文なので、これに直接対応する機能は存在しない。強いて対応するものを挙げれば“Select Case”文だろう。しかし、目的に応じて、いろいろな構文を使って置き換えることもできる。つまり、かなり大幅な書き換えが要求されると思って間違いないだろう。とはいえ、いまどき古いソースを掘り返しても、めったにお目にかかる構文ではないので、対策は目に入ってから考えても遅くないだろう。

 なおもう1つ、このサンプル・ソースには注意点がある。ソース18行目のEnd Whileを見ていただきたい。これはVB 6のサンプル・プログラム5の29行目のWendの綴りが変更されたものである。ほかの構造はすべてEnd XXXであるのに、While文の終わりだけはEnd WhileではなくWendであった妙な不整合が解消された。IDEが勝手にWendをEnd Whileに直してくれるので、意識しなくても使えるかもしれないが、一応頭の片隅に入れておくとよいだろう。

次回予告

 次回は、さまざまなファイルの扱いを中心に解説したいと考えている。

 では次回もまた会おう。End of Article


 INDEX
  連載 プロフェッショナルVB.NETプログラミング
  第6回 論理演算と制御構造
    1.Eqv演算子とImp演算子 
  2.古い制御構造On…GoToとOn…GoSub
 
「プロフェッショナルVB.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間