UWSC|関数とモジュールの書き方【使い方まとめ】

ポク太郎です。

コンピュータに意味を伝えるには“こう指令する”と決められた部分があります。つまり、ルール

どんなに眉間にシワを寄せてパソコンを睨み付けても、知らん顔どころか気付いてももらえません。よく勘違いしますが、ルールを守るしか命令を聞かせられる術がないのです。

そこしっかり把握していないと意味不明なエラーで右往左往→防備録として、関数・プロシージャ・モジュールの書き方や、処理の順番と使用法をまとめて明確にしておきます。


Functionの書き方と使用法

関数FUNCTION
関数とは

引数を渡せて、戻り値を返せる処理の塊。ローカル変数を内部で宣言できる。
構文:

FUNCTION 関数名(引数1,引数2,…,引数n)
                (色んな処理)
                RESULT=ほにゃらら
FEND

以下のように書いた場合、コンピュータは1~6行目を実行して終了します。2行目で関数が呼び出されていますが、処理の順番は、「2行目の実行」=「9、10行目の実行」です。

FOR i=0 TO 10
         n=関数名(引数1,引数2,…,引数n)
   IF n=(何か)
         (色んな処理)
   ENDIF
NEXT

FUNCTION 関数名(引数1,引数2,…,引数n)
         (色んな処理)
         RESULT=ほにゃらら
FEND

上記は1ファイルにメインと関数を書いた場合。

下記は関数部分を別ファイルにした場合。

メインプログラムの先頭でCALL関数のあるファイル名“とすることで、関数のあるファイルを取り込んで実行。

メインプログラム.uwsは、

CALL "部品.uws"
FOR i=0 TO 10
         n=関数名(引数1,引数2,…,引数n)
   IF n=(何か)
         (色んな処理)
   ENDIF
NEXT

部品.uwsは、

FUNCTION 関数名(引数1,引数2,…,引数n)
         (色んな処理)
         RESULT=ほにゃらら
FEND

メインプログラムを実行すると、1行目から開始し、7行目まで実行すると終了します。

メインプログラム3行目で関数が呼び出されてますが、処理の順番は、「3行目の実行」=「部品.uws内の2、3行目の実行」です。

別フォルダの部品ファイルを指し示す方法はこちら(関数ファイルを別フォルダに置く【使い方まとめ】)をご参考に。

Procedureの書き方と使用法

プロシージャPROCEDURE
プロシージャとは

引数を渡せて、戻り値を返せない処理の塊。ローカル変数を内部で宣言できる。
構文:

PROCEDURE プロシージャ名(引数1,引数2,…,引数n)
                (色んな処理)
FEND

関数FUNCTIONと同様です。

Moduleの書き方と使用法

モジュールMODULE
モジュールとは

複数のグローバル変数、関数、プロシージャを一塊にしたブロック。内部の関数、プロシージャ内では通常と同様にローカル変数を宣言できる。
構文:

MODULE モジュール名
                PUBLIC 変数1


   FUNCTION 関数1名(引数1,引数2,…,引数n)
                (色んな処理)
                RESULT=ほにゃらら
   FEND


   PROCEDURE プロシージャ1名(引数1,引数2,…,引数n)
                (色んな処理)
                RESULT=ほにゃらら
   FEND
ENDMODULE

以下のように書いた場合、コンピュータは1~6行目を実行して終了します。2行目でモジュール内の関数が呼び出されますが、処理の順番は「2行目の実行」=「9、10、13、14行目の実行」。

モジュール内の関数を呼び出す際には、2行目のように“モジュール名.関数名()”と.(ピリオド)で区切って指定。

ただし、モジュール内の関数から同一モジュール内の関数を呼び出す場合は、“関数名()”のみで指定。

これがモジュールを含むプログラム。

FOR i=0 TO 10
         n=モジュール名.関数名(引数1,引数2,…,引数n)
   IF n=(何か)
         (色んな処理)
   ENDIF
NEXT

MODULE モジュール名
   PUBLIC pi=3.14159265359
   PUBLIC et=2.71828182846

   FUNCTION 関数名(引数1,引数2,…,引数n)
         (色んな処理)
         RESULT=ほにゃらら
   FEND
ENDMODULE
ご注意】モジュール内の関数を呼び出した際、9、10行目も実行→メインの2行目より前で変数pietに別の値をセットしても、呼び出した瞬間に9、10行目の値に再セットされます。

上記は1ファイルにメインとモジュールを書いた場合。

下記はモジュール部分を別ファイルにした場合。

メインプログラムの先頭でCALLモジュールのあるファイル名“とすることで、モジュールのあるファイルを取り込んで実行。

メインプログラム.uwsは、

CALL "部品.uws"
FOR i=0 TO 10
         n=モジュール名.関数名(引数1,引数2,…,引数n)
   IF n=(何か)
         (色んな処理)
   ENDIF
NEXT

部品.uwsは、

MODULE モジュール名
   PUBLIC pi=3.14159265359
   PUBLIC et=2.71828182846

   FUNCTION 関数名(引数1,引数2,…,引数n)
         (色んな処理)
         RESULT=ほにゃらら
   FEND
ENDMODULE

メインプログラムを実行すると、1行目から開始し、7行目まで実行すると終了します。

メインプログラム3行目でモジュール内の関数が呼び出されてますが、処理の順番は、「3行目の実行」=「部品.uws内の2、3、6、7行目の実行」です。

別フォルダの部品ファイルを指し示す方法はこちら(関数ファイルを別フォルダに置く【使い方まとめ】)をご参考に。

Moduleの使い所

関数やプロシージャは処理の塊。千変万化する値を引数として渡すことで1コードでなされる処理が変化→それを利用し“共通の部品”を実現し、プログラムを構造的に見やすく構築します。

ではモジュールは?

以下が例です。面積の公式を一まとめにしたモジュールです。このように似通った意味の関数群をグローバル変数付で一まとめにすることができます。

無理矢理モジュール内の関数を使い回そうとして分かり辛くなってますが、四角形、三角形、台形、円の面積を求める関数をモジュールで一塊に。

MODULE menseki
   PUBLIC pi=3.14159265359
   FUNCTION 4kaku(teihen,takasa)
         RESULT=teihen*takasa
   FEND
   FUNCTION 3kaku(teihen,takasa)
         RESULT=4kaku(teihen,takasa)/2
   FEND
   FUNCTION daikei(jotei,katei,takasa)
         RESULT=3kaku(jotei+katei,takasa)
   FEND
   FUNCTION en(r)
         RESULT=pi*r*r
   FEND
ENDMODULE

プログラムが大きくなってくると、面倒なことが起きてきます。

・最適な関数名が既に使用済
・どの機能で使用するためのグローバル変数なのか分からなくなる
・関数が大きくなり、その関数専用の別関数を作りたくなる

など。

なので、
⇒共通の意味・目的の関数群をモジュールで一塊に。

筆者も使いこなせていませんが、構造的に作り上げるために是非活用したい機能です。

UWSCの便利な記述方法の話題
便利!
関数の引数・戻値に配列変数
関数の定義と呼び出し方【使い方まとめ】 関数とモジュールの書き方・使用法【使い方まとめ】
本記事の内容は以下でした。
○わかりやすいプログラムを構築するために

関数、プロシージャの書き方、処理の順番と使用法
モジュールの書き方、処理の順番と使用法
モジュールの使い所

コメント

タイトルとURLをコピーしました