サブルーチン
プログラマーからひとこと
これまでいろいろな命令をおぼえてきましたが、そのクライマックスになりそうなのが、これから出てくる「GOSUB」命令です。ここまでおぼえれば初心者のプログラムはもう最後といっていいかもしれません。
英語としてもわりとヘンなんですが、もともとの意味は「
サブルーチンといえば、前にもちょっとだけ出てきましたね。
「行って帰ってくる小さなプログラムのブロック」なんて説明もしましたが、おぼえてましたか?
この「行って帰ってくる」をカンタンにするのがGOSUB命令ですが、くわしくはインテリ君の説明にまかせましょう。
GOSUB命令
ワンパク「サブルーチンのハナシはもう終わったんじゃねェのか? ヨウするに「行って帰ってくる小さなプログラムのブロック」がサブルーチンなんだろ?」
インテリ「そこまでは合ってるよ。これからおぼえるGOSUB命令は、それをもっとラクにするための命令だね。」
神崎「たしかサブルーチンは、こういうものだったよね。
」
0001#. ’メインルーフ゜
0002#. @MAIN
0003#. PRINT”ココハ メインルーフ゜ テ゛ス”
0004#. GOTO @SUB
0005#. @MAIN2
0006#. GOTO @MAIN
0007#.
0008#. ’サブルーチン
0009#. @SUB
0010#. PRINT”ココハ サフ゛ルーチン テ゛ス”
0011#. GOTO @MAIN2
これだとホントにサブルーチンにするイミのない、グルグル回るだけのプログラムだけど……。0002#. @MAIN
0003#. PRINT”ココハ メインルーフ゜ テ゛ス”
0004#. GOTO @SUB
0005#. @MAIN2
0006#. GOTO @MAIN
0007#.
0008#. ’サブルーチン
0009#. @SUB
0010#. PRINT”ココハ サフ゛ルーチン テ゛ス”
0011#. GOTO @MAIN2
」
インテリ「うん、でもおさらいとしてはこれでいいんじゃないかな。4行目でサブルーチン@SUBに行って、11行目でメインループの中の@MAIN2に帰るんだね。」
ワンパク「コレをカンタンにするのがGOSUB命令だってのか? スデにかなりカンタンな気もするが……」
インテリ「まあ見てみようよ。GOSUB命令を使うと、こういうプログラムになるね。
」
0001#. ’メインルーフ゜
0002#. @MAIN
0003#. PRINT”ココハ メインルーフ゜ テ゛ス”
0004#. GOSUB @SUB
0005#.
0006#. GOTO @MAIN
0007#.
0008#. ’サブルーチン
0009#. @SUB
0010#. PRINT”ココハ サフ゛ルーチン テ゛ス”
0011#. RETURN
4行目でGOSUB命令を使っているのがわかるね。0002#. @MAIN
0003#. PRINT”ココハ メインルーフ゜ テ゛ス”
0004#. GOSUB @SUB
0005#.
0006#. GOTO @MAIN
0007#.
0008#. ’サブルーチン
0009#. @SUB
0010#. PRINT”ココハ サフ゛ルーチン テ゛ス”
0011#. RETURN
」
ワンパク「それだけじゃねェぞ、5行目にあったラベルが消えてんじゃねェか! これじゃサブルーチンから戻ってこれなく……アレ?」
神崎「サブルーチンの最後が、GOTO命令じゃなくRETURNになっているね。」
インテリ「GOSUB命令は、RETURN命令とセットで使うんだ。
プログラムを見ればだいたい分かるかな? GOSUBのあとにRETURNがあると、GOSUBしたすぐアトまで自動で帰るんだね。」
プログラムを見ればだいたい分かるかな? GOSUBのあとにRETURNがあると、GOSUBしたすぐアトまで自動で帰るんだね。」
ワンパク「……リクツはワカッたぜ。あんがいカンタンなモンなんだな。」
神崎「サブルーチンに行くたびにラベルを付けなくてよくなるのは、たしかにベンリかな。」
ワンパク「しかしコレ……サブルーチンって、ホントにやらなきゃダメか? ワザワザGOTOやGOSUBで飛ばさなくても、メインループの中でやればいいコトじゃねェか?」
インテリ「いいトコロに気が付いたね。ジツはここまでで使ったサブルーチンは、たしかにサブルーチンの良さがちゃんと出てないんだな。
そこで、このプログラムを見てもらおうか。
」
そこで、このプログラムを見てもらおうか。
0001#. ’メインルーフ゜
0002#. @MAIN
0003#. A=1
0004#. GOSUB @SUB
0005#. A=2
0006#. GOSUB @SUB
0007#. GOTO @MAIN
0008#.
0009#. ’サブルーチン
0010#. @SUB
0011#. PRINT A;”カイメ ノ サフ゛ルーチン”
0012#. RETURN
ドコがポイントか、わかるかな?0002#. @MAIN
0003#. A=1
0004#. GOSUB @SUB
0005#. A=2
0006#. GOSUB @SUB
0007#. GOTO @MAIN
0008#.
0009#. ’サブルーチン
0010#. @SUB
0011#. PRINT A;”カイメ ノ サフ゛ルーチン”
0012#. RETURN
」
神崎「サブルーチンに行く前に、変数Aのナカミを変えているね。それにメインループの中から2回、同じサブルーチンに飛んでいるよ。」
ワンパク「それからサブルーチンの中でも変数Aを使ってるぜ! つまり……サッパリわからねーな!」
インテリ「そ、そうなの?
まず同じサブルーチンでも、RETURNで帰る行がちがうというのが1つ目のポイントかな。」
まず同じサブルーチンでも、RETURNで帰る行がちがうというのが1つ目のポイントかな。」
神崎「同じRETURNなのに、4行目から飛んできたときは4行目に帰ってきて、6行目から飛んできたときは6行目に帰るんだね。ちゃんとしてるなあ。」
ワンパク「タシカにそれと同じコトをGOTOでやるのはメンドクセェな……。アチコチから飛ぶんならGOSUBを使えってコトか。」
インテリ「もう1つのポイントは、1コだけのサブルーチンでも、GOSUBする前の変数によってPRINTする字が変わるコトだね。」
神崎「PRINTにかぎらず、変数によってやることを変えられるんだね。」
インテリ「そういうコトだね。いろいろなプログラムを見てみるとわかるけど、決まった動きを、変数のナカミによって変えながらできるのがサブルーチンの良さだね。」
ワンパク「つまりサブルーチンってのは、プログラムのどこから、どんなジョウタイでも、「オイこれやっとけ」って言えば空気を読みながらひととおりのシゴトをこなすってワケだな。」
インテリ「どうしたのワンパク君、よくわかってるじゃないか!」
ワンパク「いや、リソウのパシリってこんなカンジじゃねえかって考えたら……」
インテリ「……」
神崎「……」
- GOSUB~RETURN命令
- GOSUB @(ラベル)
RETURN
GOSUBで指定したラベルまでジャンプします。その後にRETURNと書いてあれば、GOSUBの直後まで戻ります。