Top > サブルーチン

**サブルーチンの効果 [#q5775875]
サブルーチンを使う事で断片的なプログラムを書くことができる。
効果
>
-同じような処理をサブルーチンにすることで、プログラムが短くなる。
-プログラムをブロックごとに見通すことでバグの発見に役立つ
-汎用化されたサブルーチンは、他のプログラムで再利用できる。

サブルーチンの種類
手続き型 と 関数型 の2種類がある。
 手続き型  返り値がない
 関数型   返り値がある
>何か値を返す処理には、関数型を使う。
**手続き型サブルーチン [#i9067dd2]
 手続き型サブルーチン(Procedure)は以下のように書きます。
PROCEDURE サブルーチン名(パラメータ変数:変数の型;パラメータ変数:変数の型
...)
VAR
  変数宣言;
BEGIN
  文;
END;
>例 指定した回数の警告音を鳴らすサブルーチン
PROCEDURE DoBeep(count:INTEGER);
VAR
  i:INTEGER;
BEGIN
  FOR i:=1 TO count DO
    Sysbeep;
END;

***[サブルーチンの呼び出し方] [#o6c7f997]
メインプログラムの中でこのサブルーチンを呼び出す時は、
サブルーチン名とパラメータを書きます。
''サブルーチン名(パラメータ);''
>例
DoBeep(3);
サブルーチンの名前が間違っていたり、パラメータの数や変数の型が合っていないとエラーになります。
悪い例
 DuBeep(3); サブルーチンの名前が違う
 DoBeep(2,4); パラメータの数が多い
 DoBeep('Hellp'); 変数の型が違う

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

例 変数とパラメータを使わないサブルーチン
>PROCEDURE DoBeep;
BEGIN
   SysBeep;
END;
***[複数のパラメータを持つサブルーチン] [#l58dd57c]
パラメータの数が複数ある場合は、セミコロン(;)で区切った後に連続して書きます。
>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;
***[値を返すパラメータ] [#q62999be]
パラメータで渡した変数の値をサブルーチン内で変更し、戻させる為には
パラメータの前に 「VAR」を書きます。
>(サブルーチン1)
PROCEDURE Sub(value:REAL);
BEGIN
  value:=100;
END;

>(サブルーチン2)
PROCEDURE Sub(&color(Red){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宣言しているので、呼び出し側(メインプログラム)の変数が変わります。
**関数型サブルーチン [#vb5656ae]
関数型サブルーチン(Function)は、返り値があるだけで他は手続き型と同じです。
関数(Function)型サブルーチンは、返り値があるだけで他は手続き型と同じです。
サブルーチンは以下のように書きます。
>FUNCTION サブルーチン名(パラメータ変数:変数の型):返り値の変数の型;
VAR
  変数宣言;
BEGIN
  文;
END;

例 関数型サブルーチンの例
>FUNCTION Compare(value1,value2:REAL):BOOLEAN; &color(Green){{Compare:比較する}};
BEGIN
   IF value1<value2 THEN
     Compare:=TRUE
   ELSE
     Compare:=FALSE
END;

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

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

result:=Compare(10,20);
**グローバル変数とローカル変数 [#xcb0266e]
メインプログラムで宣言した変数をグローバル変数と言います。
グローバル変数はメインプログラムの中で使用できるほか、
サブルーチンの中でも使用できます。
一方、サブルーチンの中で宣言した変数をローカル変数と言います。
ローカル変数はサブルーチンの中だけで使う事ができます。
メインプログラムの中でローカル変数を使うとエラーになります。
[例題プログラム]
>PROCEDURE TEST;
VAR
  a,b:REAL;  &color(Green){{グローバル変数}};
FUNCTION Sub:REAL;
VAR
  x,y:REAL; &color(Green){{ローカル変数}};
BEGIN
  x:=a*4;  &color(Green){{グローバル変数はプログラム全体で使用できる}};
  y:=a/10;  &color(Green){{サブルーチンの中でも使用できる}};
  Sub:=x*(y+20);
END;
 
BEGIN
  a:=50;  &color(Green){{グローバル変数に整数を代入}};
  b:=20;  &color(Green){{エラー!ローカル変数はサブルーチンの中でしか使えない}};
  b:=Sub;
END;
Run(TEST);
**まとめ [#k48e0792]
言語仕様はなかなか覚えられない。
一通りルールを覚えたら、実際にプログラムを組み立てて、エラーと試行錯誤を繰り返す事が大事。

リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS