Files
krkr2doc/docs/kag3doc/contents/SubRoutine.html
2016-09-08 17:50:19 +09:00

92 lines
6.3 KiB
HTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<!-- generated by to_html.pl from SubRoutine.xml -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>サブルーチンを使おう</title>
<meta name="author" content="W.Dee" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link href="browser.css" type="text/css" rel="stylesheet" title="吉里吉里関連リファレンス用標準スタイル" />
<link href="mailto:[email protected]" rev="Made" />
<link href="index.html" target="_top" rel="Start" title="トップページ" />
</head>
<body>
<h1><a id="id196" name="id196">サブルーチンとは</a>
</h1><div class="para"><div>
 サブルーチンとは、いくつかの処理のをまとめた物で、ほかの箇所から「呼び出して」つかう物です。サブルーチンの処理が終わると、呼び出した所へ制御が戻ります。<br />
<br />
 マクロ <span class="comlink"> ( → <a target="main" class="jump" href="Macro.html">マクロを使おう</a> ) </span> と機能は似ていますが、サブルーチンの方がより本格的な処理を行うのに対し、マクロは簡単な処理を行う用途です。<br />
</div></div>
<h1><a id="id197" name="id197">サブルーチンの基本的な使い方</a>
</h1><div class="para"><div>
 サブルーチンはラベルによって区別されますので、ラベルを定義します。サブルーチンから呼び出し元に戻るところに <a id="id198" name="id198" class="targanchor"><dfn>return</dfn></a> タグ、サブルーチンを呼び出すには <a id="id199" name="id199" class="targanchor"><dfn>call</dfn></a> タグを用います。<br />
 下の例を見てください。<br />
<br />
<code class="bq">[wait&nbsp;time=200]<br />
*start|スタート<br />
[cm]<br />
サブルーチンを呼び出します。[l][r]<br />
<em>[call&nbsp;target=*subroutine]</em><br />
サブルーチンを呼び出しました。<br />
[s]<br />
<br />
<em>*subroutine</em><br />
これはサブルーチンです。[l][r]<br />
クリックをすると呼び出し元に戻ります。[l][r]<br />
<em>[return]</em><br />
</code>
<br />
<br />
 さて、この例を実行させると、「サブルーチンを呼び出します。」のメッセージのあとに「これはサブルーチンです。」と表示され、「クリックをすると呼び出し元に戻ります。」でクリックすると、「サブルーチンを呼び出しました。」と表示されるはずです。<br />
 つまり、call タグで指定したラベルにジャンプをするのですが、このときに呼び出した位置が自動的に記録され、return タグでは、この記録された呼び出し元に自動的に戻ります ( この自動的に記録されるものを「<a id="id200" name="id200" class="targanchor"><dfn>コールスタック</dfn></a>」と呼んでいます )。<br />
 この例では、<code class="inlinecode">*subroutine</code> から <code class="inlinecode">[return]</code> までが「サブルーチン」です。<br />
<br />
 サブルーチンの中からほかのサブルーチンを呼び出すこともできます。呼び出しの深さ ( return せずにいくつまで call できるか ) に制限はありません。<br />
<br />
 ちなみに「選択肢を使ってみよう」の所ではラベルの次には [cm] を書くと書きましたが、セーブの箇所となるような ( | 付きの ) ラベルの次でなければ [cm] を書かなくても OK です。<br />
<br />
<br />
 コールスタックには、シナリオファイル名、シナリオ中の直前のラベルとそれから call タグのある行までの行数、call タグのある行の内容、その行内での位置の情報しか記録されません。シナリオのデバッグ中などで、戻り先のシナリオファイル中の構成が変わるととんでもない位置に戻ってしまう場合があるので注意してください。<br />
 基本的には、サブルーチンのラベルやサブルーチン中には、セーブ箇所となるラベル ( | 付きのラベル ) を使わない/作らないが吉です。<br />
</div></div>
<h1><a id="id201" name="id201">サブルーチンに関する注意</a>
</h1><div class="para"><div>
 call で自分自身を呼びだしてしまったりすると無限ループにはまります。<br />
 call と return の対応がとれていないと、どんどんコールスタックが増えていったり、あるいは return タグのところで呼び出し元に戻れなくなってエラーになる事がありますので、注意してください。<br />
<br />
 それと、次の例のように<br />
<br />
<br />
<code class="bq">*subroutine<br />
・・・<br />
[if&nbsp;exp=&quot;f.flag1&quot;]<em>[jump&nbsp;target=*otherplaces1]</em>[endif]<br />
[if&nbsp;exp=&quot;f.flag2&quot;]<em>[jump&nbsp;target=*otherplaces2]</em>[endif]<br />
・・・<br />
[return]<br />
<br />
*otherplaces1<br />
・・・<br />
[return]<br />
<br />
*otherplaces2<br />
;この先には&nbsp;return&nbsp;タグがない・・・<br />
</code>
<br />
<br />
 サブルーチン中で他の場所にジャンプする場合は注意してください。otherplaces1 にジャンプする場合は、ジャンプ先に return があるので call ~ return のバランスを崩すことはありません。しかし、otherplaces2 にジャンプする場合、ジャンプした先に return が現れないので、そのサブルーチンからは「戻ってない」ことになります。つまり、call ~ return のバランスを崩してしまいます。<br />
<br />
 もし、呼び出し元に戻るのではなく、任意の場所に戻りたい場合は、return タグの storage や target 属性を利用して、任意の場所に戻ることができます。<br />
</div></div>
<script type="text/javascript" charset="UTF-8" src="documentid.js" ></script>
<script type="text/javascript" charset="UTF-8" src="postcontent.js" ></script>
</body>
</html>