サブプログラムについて

注意!

SmileBASIC Ver.4は初心者向け言語として平易な言語仕様を目指していますが、サブプログラムだけは例外として高度なプログラミング能力を要求します。

サブプログラムとは

サブプログラムはプチコン4で新たに導入された仕組みで、普段実行しているプログラムと別にサブプログラムと呼ばれる全く別のプログラムを同時に実行する事ができます。

(以下、通常のプログラムはメインプログラムと呼びます。またメインプログラムを動かすインタプリタをメインインタプリタ、サブのそれをサブインタプリタと呼びます)

いわゆるマルチタスク・マルチスレッドと似た仕組みですが、メインプログラムとは独立していつでも呼び出せていつでも止められ、画面の一部もしくは全部を占有してプログラム作成の補助を行うようなツール制作に特化した仕組みがサブプログラムです。メインプログラムの一部処理をサブプログラムに逃がす等の並列処理用途には使えませんので御注意ください。

またメインインタプリタとの重要な違いとして、サブインタプリタはダイレクトモードを持ちません。セーブしたプログラムのみサブプログラムとして実行でき、実行が終了するとダイレクトモードには戻らずにインタプリタが終了します。

サブプログラム記述時の注意点

通常のSmileBASICプログラムと異なり、サブプログラムを作成する際にはいくつか守らなければならないルールがあります。ルールを守らない場合画面が表示されなかったりプログラムが正常に動作しない可能性があります。

基本的な仕組み

・サブインタプリタは、メインインタプリタと全く同じメモリ容量、プログラムスロット、画面構成を持ちます。お互いのメモリ空間・プログラムスロット・画面は完全に独立しており、後述する特定命令以外ではお互いに干渉する事はできません。
・メインプログラムからサブプログラムを起動・停止する命令は存在しません。つまり、特定のプログラム2個が協調動作するようなプログラムを書くことはできません。
・サブプログラムは正常終了・エラー終了にかかわらず、終了すると画面表示もオフになります。実行状況の把握が極めて難しいため、先に通常のメインプログラムとして作成する事をお勧めします。また引数付きのSTOP命令も活用してください。

画面制御

・サブプログラムは起動直後は画面に表示されません。画面に表示するにはまずXSUBSCREEN命令を使用して下さい。XSUBSCREENは画面内でサブプログラムが占有する領域を定義する命令です。メインプログラムが画面全体を使えるのに対し、サブプログラムはXSUBSCREENで定義した領域内のみ使えるという事になります。
・サブプログラムの画面は常にメインプログラムより手前に描画されます。

入力関連

・XCTRLSTYLE命令は無視されます。つまり、コントローラー設定は常にメインプログラムの設定に依存する事になります。サブプログラム実行中に突然設定が変わる事もありえます。コントローラーIDは0番以外使い物にならないと思って下さい。また振動命令も使用できません。
・コントローラー、キーボード、タッチ・マウスといった入力は、「フォーカス」を持ったプログラムに渡されます。フォーカスは通常サブプログラム起動中はサブに、それ以外はメインが持っていますが、ENVFOCUS命令を使う事でサブプログラムから一時的にメインプログラムにフォーカスを渡したり奪う事が可能です。メインプログラムからはフォーカスを制御する事はできません。

メイン・サブ間の相互作用

・メインインタプリタの情報取得は、サブプログラム関連命令を使用します。ENVで始まる命令はサブプログラム関連となります。
・サブプログラム関連命令をメインプログラムで使用すると、エラーにならずにほとんど無視されたり、ダミーの値を返します。逆にメインプログラムでしか使えない命令をサブプログラムで使用した場合、ほとんどが実行しても無視されます。サブプログラム開発の便宜を図るための仕様です。
・ENV系命令で取得したメインインタプリタの状態はいつ変動するか保障されません。メインとサブ、2つのインタプリタはお互い完全に独立・並列に動作していて、サブプログラムとメインインタプリタの間ではお互いに排他制御をかける事はできません。
・メインインタプリタへの干渉は、ENVSAVE,ENVFOCUS,PUSHKEY命令でのみ可能です。
・メインインタプリタからサブインタプリタへの干渉はSUBSTOPダイレクトモードコマンドによるサブプログラム停止以外できません。情報取得も一切できません。
・カレントプロジェクトは、メインとサブで異なり、サブは常に起動プログラムが格納されたプロジェクトがカレントプロジェクトとなりますが、ENVPROJECT命令を使用する事でメインのカレントプロジェクトに同期させる事ができます。
・ダイアログの表示は、メイン・サブ間で排他となり、どちらか先に表示した方が閉じるまで、もう片方のダイアログを使用する命令はブロックされます。