AX

電霊ログ

私のやってるサイト、電子の言霊の活動ログ

カテゴリークラウド

タグリスト

最近のトラックバック

月別アーカイブ(タブ)

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  • [HSP超入門] ネストレベル2

前回ネストレベルに付いて書いた時、
repeat の後は必ず continue か break か loop でループを抜ける、
gosub の後は同じように return で戻るらなければいけないと説明しましたが、これらの基本を理解する事で変則的ですが repeat や gosub 中でも goto を使う事が出来る様になります。

どういう事かというとネストは単に深さを知るためだけの物ではないと言う事です。たとえば gosub はどんなに離れた場所へジャンプしようと return を実行すれば必ず元の呼び出された場所に戻って来なければいけません、そのためには元の呼び出し元の位置を記憶しておく必要があります。HSPの内部では単なる重なりだけでなくそれぞれの呼び出し元の位置も一緒に記憶しているのです。
それでなにが分かるかと言うとネスト1にはネスト1の呼び出し元がネスト2にはネスト2の呼びだし元がそれぞれ存在している事になります、そして return を使えばそれに応じた呼び出し元の位置に戻って来る事が出来ます。

と言う事は gosub でサブルーチンジャンプした後に goto でジャンプしたとしても、その goto の先で return を使えば正確に元の位置へ戻してくれると言う事です。
では実際に試してみましょう。
実行するとネストレベルを画面に表示しますが、ずっと1のまま増えていない事が確認出来ます。まさに思った通りの動作で大成功です。

repeat
gosub *label1
wait 50
loop

*label1
goto *label2
stop

*label2
mes sublev
mes looplev
return


このサンプルでは、メインループから gosub で *label1 へサブルーチンジャンプし更にそこから goto で *label2 へジャンプして、その label2 の中から return を実行しています。
さて、この return は一体どこに戻っているのでしょう、return は呼び出し元に戻す命令です、それなら goto のある7行目でしょうか? って違いますね! return のネストに対応した gosub 命令のある2行目に戻って来ています。なので8行目にある stop は実行されません。
(上のサンプルは repeat を使っていますが、もちろん *main ~ goto でも大丈夫です)

repeat 内のからの goto も同じように実行する事が出来ます。

repeat
wait 50
goto *label
loop

repeat
*label
mes sublev
mes looplev
loop


ちょっと見にくいですが、考え方はさっきと同じです。
ただ違うのは *label を repeat loop で囲んでいる事です。repeat loop は単独で存在できない(エラーが出る)でのこれをしないと実行出来ません。もちろん continue や break も出来ます。しかし break の場合は元の場所には戻りません。どうやら自分から見て下方向にある loop を抜けようとするようです。
それともう1つ、今回の場合 wait は goto より上にないと無限ループになりますので注意。

でもちょっとくらい無理が聞くからってこういうのはダメです。

*main
gosub *label
wait 50
goto *main

*label
repeat
if cnt=1 {
mes sublev
mes looplev
return
}
loop


gosub で跳んで repeat に入り適当な条件によって return で元の gosub のあった2行目に戻って来れているので一見これで良い様に見えますが、reoeat を loop,continue,break 以外で離れループから抜け気っていないのでネストレベルが貯まって行きます。

これもダメです。

repeat
wait 50
goto *label1
loop

*label1
gosub *label2

repeat
*label2
mes sublev
mes looplev
loop


1行目の repeat に対しての 13行目の loop は効いていますが、7行目の gosub に対しての return がありませんので sublev のネストレベルが貯まってしまいます。

今回内部の動きを理解するために、こういう無茶で変則的な荒業を紹介しましたが、プログラムが見にくく改良し辛くなる可能性が高くなってしまうので、実行出来るからと言って実験的プログラム以外ではこの様な書き方はなるべくしない方がいいでしょう
関連記事

コメント

コメントの投稿

   管理者にだけ表示を許可する
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。