AX

電霊ログ

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

カテゴリークラウド

タグリスト

最近のトラックバック

月別アーカイブ(タブ)

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

ここで、今までに覚えてきた repeat と gosub の注意点に付いて触れておきたいと思います。
それはネストレベルに付いてです。
ネストは前に説明したので分かると思いますが、自分の中に自分と同じ構造の物が入っている状態の事です。
それでネストレベルとは何かと言うと、ネストがいくつ重なっているかを表す物で、ネストの深さとも言われます。
例えば、この下のスクリプトの「ここは?」と書かれた場所のネストレベルは1になります。

repeat 10
mes "ここは?"
loop


そしてこの下のスクリプトの「ここは?」と書かれた場所のネストレベルは2になります。

repeat 10
repeat 10
mes "ここは?"
loop
loop


今やったのは repeat でのネストレベルでしたが、gosub にもネストレベルがあります。
またまた例で見てみましょう。
ここは?と書かれた所のネストレベルは1です。

gosub *label1
stop
*label1
mes "ここは?"
return


そして下のスクリプトでは、ここは?と書かれた所のネストレベルは2になります。

gosub *label1
stop
*label1
gosub *label2
return
*label2
mes "ここは?"
return


もちろん次の様なスクリプトでのネストレベルは0です。

mes "ここは?"


さてここからが本題です、はじめにも言いましたがネストレベルに付いて注意する点があります。
それは何かと言うと、HSPではネストレベルに限界があって、
repeat で31、gosub で126 のネストレベルを超えてはいけないのです。
もしもこれを超えるとエラーが出てしまいます。

前に gosub の説明をした時「gosub は往復切符だから return で戻らないと戻りの切符がどんどんたまって行ってしまう」と書きましたが実はそれがネストレベルだったのです。
gosub命令では gosub が実行された時にネストレベルが1つ上がり、return命令が実行される事で始めてネストレベルが1つ下がります。ですので gosub でジャンプしたにもかかわらず return を使わずに戻ってきてしまうと、ネストレベルが増えたきり下がりません、そしてこれが何回も繰り返されネストレベルの上限を超えてしまった時にHSPが「なんかおかしい事になってるよ」と言う具合でエラーを出します。

repeat命令の時も同じで repeat が実行された時にネストレベルが1つ上がり、loop命令、continue命令、break命令 のどれかで loop を抜けて始めてネストレベルが1つ下がります。ですので repeat を実行したのに loop,continue,break を使わないでループを抜ける様なプログラムを書いてしまうとネストレベルが下がらなくなり、これが繰り返され上限を超えてしまうとHSPがエラーを出します。

これまで「ネストレベル」と一言で片付けて来ましたが、repeat のネストレベルと gosub のネストレベルは別々に管理されていて、お互いのネストレベルが混ざってしまう事はありません。

実際に確かめて見ましょう。
HSPには現在のネストレベルが分かる便利な システム変数が用意されていますので、それを使って見てみる事にします。

まずは looplev です。
looplev は現在の repeat のネストレベルを格納しているシステム変数です。

次に sublev です。
sublev は現在の gosub のネストレベルを格納しているシステム変数です。

(「現在の」と言うのは そのシステム変数が使われた瞬間です)

まず repeat のネストを確認してみます。
ちゃんと loop がありますがその前に goto があって最初の *a に飛ばしているのでこの loop は実行されません。そのためネストレベルが増え続けていきます。

*a
repeat
mes "ループレベル="+looplev+" サブレベル="+sublev
wait 100
goto *a
loop


下のサンプルは gosub のネストを確認します。
4行目の gosub でラベル *b に飛ばした後 return を実行したいところですが、その前にある goto で *a 戻ってしまっているので、永遠に return は実行されません、そのためネストレベルが増え続けます。

*a
mes "ループレベル="+looplev+" サブレベル="+sublev
wait 100
gosub *b
goto *a

*b
goto *a
return


最後に repeat と gosub のネストレベルを同時に確認して見ます。

*a
repeat
mes "ループレベル="+looplev+" サブレベル="+sublev
wait 100
gosub *b
loop

*b
goto *a
return


こうして見ると、repeat のネストレベルと gosub のネストレベルが別の物だという事がはっきり分かりますね、なれない内はこの両方を意識しながらプログラムを書いていくのは大変かもしれませんが「repeat の後は loop か continue か break から抜ける」、「gosub を使ったら return で戻る」という基本的な事をしっかりやっていれば、これらが原因で起こる不具合に悩まされる事は少なくなるでしょう。
と言うよりもこの事実を知っていると言う事が重要なのです。
関連記事

コメント

コメントの投稿

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