Top > サブルーチン

サブルーチンの効果 Edit

サブルーチンを使う事で断片的なプログラムを書くことができる。
効果

  • 同じような処理をサブルーチンにすることで、プログラムが短くなる。
  • プログラムをブロックごとに見通すことでバグの発見に役立つ
  • 汎用化されたサブルーチンは、他のプログラムで再利用できる。

サブルーチンの種類
手続き型 と 関数型 の2種類がある。
 手続き型  返り値がない
 関数型   返り値がある

何か値を返す処理には、関数型を使う。

手続き型サブルーチン Edit

 手続き型サブルーチン(Procedure)は以下のように書きます。
PROCEDURE サブルーチン名(パラメータ変数変数の型;パラメータ変数変数の型
...)
VAR
  変数宣言;
BEGIN
  文;
END;

例 指定した回数の警告音を鳴らすサブルーチン
PROCEDURE DoBeep(count:INTEGER);
VAR
  i:INTEGER;
BEGIN
  FOR i:=1 TO count DO
    Sysbeep;
END;

サブルーチンの呼び出し方] Edit

メインプログラムの中でこのサブルーチンを呼び出す時は、
サブルーチン名とパラメータを書きます。
サブルーチン名(パラメータ);


DoBeep(3);
サブルーチンの名前が間違っていたり、パラメータの数や変数の型が合っていないとエラーになります。
悪い例
 DuBeep(3); サブルーチンの名前が違う
 DoBeep(2,4); パラメータの数が多い
 DoBeep('Hellp'); 変数の型が違う

[ローカル変数とパラメータのないサブルーチンEdit

サブプログラム内の変数を使わないときは、変数宣言を省略できる。
また、パラメータが無い場合も省略できます。

例 変数とパラメータを使わないサブルーチン

PROCEDURE DoBeep;
BEGIN
   SysBeep;
END;

[複数のパラメータを持つサブルーチンEdit

パラメータの数が複数ある場合は、セミコロン(;)で区切った後に連続して書きます。

PROCEDURE Compare(value1:REAL;value2:REAL);
BEGIN
   IF value1=value2 THEN
     SysBeep
END;

変数の型が同じ場合に限り、カンマ(,)で区切ってひとくくりにできる。

PROCEDURE Compare(value1,value2:REAL);
BEGIN
   IF value1=value2 THEN
     SysBeep
END;

[値を返すパラメータ] Edit

パラメータで渡した変数の値をサブルーチン内で変更し、戻させる為には
パラメータの前に 「VAR」を書きます。

(サブルーチン1)
PROCEDURE Sub(value:REAL);
BEGIN
  value:=100;
END;

(サブルーチン2)
PROCEDURE Sub(VAR value:REAL);
BEGIN
  value:=100;
END;

このサブルーチン1と2の違いは、パラメータ「value」をVAR宣言してるかどうかだけです。
実際にメインプログラムでサブルーチンを呼び出すと、以下のような結果になります。

(サブルーチン1の場合)
BEGIN
  x:=0;
  Sub(x);
END;

このプログラムを実行すると、xの値は0のままです。
VAR宣言していないので、サブルーチン内でパラメータ変数を変更しても、呼び出し側(メインプログラム)の変数は変わりません。

(サブルーチン2の場合)
BEGIN
  x:=0;
  Sub(x);
END;

このプログラムを実行すると、xの値は100に変わります。
VAR宣言しているので、呼び出し側(メインプログラム)の変数が変わります。

関数型サブルーチン Edit

関数(Function)型サブルーチンは、返り値があるだけで他は手続き型と同じです。
サブルーチンは以下のように書きます。

FUNCTION サブルーチン名(パラメータ変数:変数の型):返り値の変数の型;
VAR
  変数宣言;
BEGIN
  文;
END;

例 関数型サブルーチンの例

FUNCTION Compare(value1,value2:REAL):BOOLEAN; {Compare:比較する}
BEGIN
   IF value1<value2 THEN
     Compare:=TRUE
   ELSE
     Compare:=FALSE
END;

返り値を変更するときは、サブルーチンの名前を変数のように扱って代入します。
例の場合は、Compareというサブルーチン名なので、Compareに値を代入します。

サブルーチンの呼び出し方]
メインプログラムの中でサブルーチンを呼び出すには、以下のように返り値が代入されるように変数を用意します。

result:=Compare(10,20);

グローバル変数とローカル変数 Edit

メインプログラムで宣言した変数をグローバル変数と言います。
グローバル変数はメインプログラムの中で使用できるほか、
サブルーチンの中でも使用できます。
一方、サブルーチンの中で宣言した変数をローカル変数と言います。
ローカル変数サブルーチンの中だけで使う事ができます。
メインプログラムの中でローカル変数を使うとエラーになります。
[例題プログラム]

PROCEDURE TEST;
VAR
  a,b:REAL;  {グローバル変数}
FUNCTION Sub:REAL;
VAR
  x,y:REAL; {ローカル変数}
BEGIN
  x:=a*4;  {グローバル変数はプログラム全体で使用できる}
  y:=a/10;  {サブルーチンの中でも使用できる}
  Sub:=x*(y+20);
END;
 
BEGIN
  a:=50;  {グローバル変数に整数を代入}
  b:=20;  {エラー!ローカル変数サブルーチンの中でしか使えない}
  b:=Sub;
END;
Run(TEST);

まとめ Edit

言語仕様はなかなか覚えられない。
一通りルールを覚えたら、実際にプログラムを組み立てて、エラーと試行錯誤を繰り返す事が大事。


リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: Tue, 22 Nov 2011 02:18:53 JST (4558d)