はじめに
これまでのステップで、GOTO
や GOSUB...RETURN
を使ったプログラムの流れの制御を学びましたね。これらは特定の場所へジャンプしたり、簡単なサブルーチン(一連の処理のまとまり)を呼び出したりするのに便利でした。😊
しかし、プログラムが大きくなってくると、GOTO
や GOSUB
だけではコードが複雑になりがちです。「スパゲッティコード」と呼ばれる、流れが追いづらいプログラムになってしまうことも…🍝
そこで登場するのが構造化BASICの機能、SUB
と FUNCTION
です! これらは、プログラムをより整理された、読みやすく、再利用しやすい部品(モジュール)に分割するための強力なツールです。構造化プログラミングは、コードの品質を向上させるための重要な考え方です。
このステップでは、SUB
と FUNCTION
の基本的な使い方を学び、GOSUB
との違いを理解していきましょう。💡
SUB プロシージャ:値を返さない処理のまとまり
SUB
(サブルーチンやプロシージャとも呼ばれます) は、特定のタスクを実行する一連の命令をまとめたものです。GOSUB
と似ていますが、SUB
は値を返さないという特徴があります。主に、画面に何かを表示したり、ファイルに書き込んだりといった、一連の操作を実行するために使われます。
基本的な構文は以下のようになります (具体的な構文はBASICの処理系によって多少異なります):
SUB SubName (parameter1, parameter2, ...)
' ここにプロシージャの処理を書く
' ...
END SUB
SUB
と END SUB
で処理のまとまりを定義します。SubName
がこのプロシージャの名前です。括弧 ()
の中には、引数 (ひきすう、parameter) を指定できます。引数は、プロシージャを呼び出すときに外部から情報を受け取るための変数です。
SUBの例:メッセージを表示する
指定したメッセージを画面に表示する簡単な SUB
を作ってみましょう。
' メッセージを表示するSUBプロシージャの定義
SUB PrintMessage (msg AS STRING)
PRINT "メッセージ: "; msg
END SUB
' メインの処理
PRINT "プログラム開始"
CALL PrintMessage("こんにちは!") ' SUBを呼び出す
CALL PrintMessage("元気ですか?") ' 引数を変えて再度呼び出す
PRINT "プログラム終了"
この例では、PrintMessage
という名前の SUB
を定義しています。この SUB
は msg
という文字列型の引数を一つ受け取ります。メインの処理部分で CALL PrintMessage(...)
のようにして SUB
を呼び出しています (CALL
は省略できる処理系もあります)。呼び出す際に括弧の中に渡している値 ("こんにちは!"
など) が引数 msg
に渡され、PRINT
文で表示されます。👍
変数スコープについて
SUB
の中で宣言された変数 (例: DIM
文で作った変数) は、通常、その SUB
の中でしか使えません。これをローカル変数と呼びます。これにより、他の場所で同じ名前の変数を使っていても、互いに影響を与えないようになり、プログラムの見通しが良くなります。
FUNCTION プロシージャ:値を返す処理のまとまり
FUNCTION
(関数とも呼ばれます) は、SUB
と非常によく似ていますが、大きな違いは値を返すことです。計算結果などを呼び出し元に返したい場合に使います。
基本的な構文は以下のようになります:
FUNCTION FunctionName (parameter1, parameter2, ...) AS ReturnType
' ここに関数の処理を書く
' ...
FunctionName = ReturnValue ' 関数名に返す値を代入
END FUNCTION
FUNCTION
と END FUNCTION
で関数のまとまりを定義します。FunctionName
が関数名です。AS ReturnType
の部分で、この関数が返す値のデータ型 (例: INTEGER
, STRING
) を指定します。関数の中で、関数名と同じ名前の変数に値を代入することで、その値が呼び出し元に返されます (処理系によっては RETURN ReturnValue
のような構文を使う場合もあります)。
FUNCTIONの例:二つの数を足し算する
二つの数を受け取って、その合計を返す簡単な FUNCTION
を作ってみましょう。
' 二つの整数の合計を返すFUNCTION
FUNCTION AddNumbers (a AS INTEGER, b AS INTEGER) AS INTEGER
DIM result AS INTEGER
result = a + b
AddNumbers = result ' 関数名に結果を代入して返す
END FUNCTION
' メインの処理
DIM num1 AS INTEGER
DIM num2 AS INTEGER
DIM sumResult AS INTEGER
num1 = 10
num2 = 5
sumResult = AddNumbers(num1, num2) ' FUNCTIONを呼び出し、戻り値を受け取る
PRINT num1; " + "; num2; " = "; sumResult
sumResult = AddNumbers(100, 200) ' 別の値で呼び出す
PRINT "100 + 200 = "; sumResult
この例では、AddNumbers
という名前の FUNCTION
を定義しています。これは整数型の引数 a
と b
を受け取り、整数型 (AS INTEGER
) の値を返します。関数の中で計算した結果 (result
) を関数名 AddNumbers
に代入しています。メイン処理では、sumResult = AddNumbers(num1, num2)
のようにして関数を呼び出し、返された値を変数 sumResult
で受け取っています。💯
FUNCTION
内の変数 (例: result
) も通常はローカル変数です。
GOSUB と SUB/FUNCTION の比較
GOSUB
と SUB
/FUNCTION
は、どちらも処理をまとめる機能ですが、いくつかの重要な違いがあります。
機能 | GOSUB … RETURN | SUB | FUNCTION |
---|---|---|---|
定義方法 | ラベルと RETURN | SUB ... END SUB | FUNCTION ... END FUNCTION |
呼び出し方 | GOSUB label | CALL SubName(args) (CALL は省略可な場合も) | result = FunctionName(args) (式の中で使用) |
引数 (パラメータ) | 渡せない (共有変数を使う必要あり) | 渡せる | 渡せる |
戻り値 | 返せない (共有変数を使う必要あり) | 返せない | 返せる |
変数スコープ | 通常グローバル (どこからでもアクセス可) | 通常ローカル (プロシージャ内のみ) | 通常ローカル (プロシージャ内のみ) |
構造化 | 低い (流れが追いづらくなる可能性) | 高い (モジュール化しやすい) | 高い (モジュール化しやすい) |
SUB
や FUNCTION
を使うことで、引数を使ってデータを明確に渡し、FUNCTION
では結果を戻り値として受け取ることができます。また、ローカル変数によって、意図しない変数の書き換えを防ぎやすくなります。
構造化のメリット ✨
SUB
や FUNCTION
を使ってプログラムを構造化(モジュール化)することには、たくさんの利点があります。
- 読みやすさ向上: 処理のまとまりに名前が付くため、コードの目的が理解しやすくなります。
- 保守しやすさ向上: 特定の機能を修正したい場合、該当する
SUB
やFUNCTION
だけを修正すれば良いため、影響範囲が限定され、デバッグが容易になります。 - 再利用性の向上: 一度作成した
SUB
やFUNCTION
は、プログラム内の他の場所や、別のプログラムからでも呼び出して再利用できます。 - 開発効率の向上: 処理を部品化することで、分担して開発したり、既存の部品を組み合わせて新しいプログラムを素早く作成したりできます。
GOTO
や GOSUB
が完全に不要になるわけではありませんが、プログラムを整理し、より良いコードを書くためには、SUB
と FUNCTION
を積極的に活用していくことが推奨されます。
まとめ
今回は、構造化BASICの重要な要素である SUB
と FUNCTION
について学びました。
SUB
は値を返さない処理のまとまりです。FUNCTION
は値を返す処理のまとまりです。- どちらも引数を受け取ることができ、コードをモジュール化するのに役立ちます。
- ローカル変数により、変数の影響範囲が限定され、コードの安全性が高まります。
GOSUB
と比べて、より構造化され、読みやすく、保守しやすいプログラムを作成できます。
最初は少し難しく感じるかもしれませんが、実際に使ってみることで、その便利さがわかってくるはずです。色々な処理を SUB
や FUNCTION
にまとめてみましょう! 💪
参考情報
使用しているBASIC処理系(QBasic, FreeBASIC, QB64など)のマニュアルや、オンラインのチュートリアルで SUB
や FUNCTION
の詳細な構文や機能を確認することをお勧めします。
例えば、以下のようなキーワードで検索すると情報が見つかるでしょう。
- 「FreeBASIC SUB documentation」
- 「QBasic FUNCTION examples」
- 「構造化プログラミング BASIC」
コメント