2017年10月3日火曜日

[UWSC]関数とモジュールの書き方と使用法[使い方まとめ]

UWSCという開発ソフトを使って作り上げる作業を実際にやってみるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。

記事の内容

○わかりやすいプログラムを構築するために
関数、プロシージャの書き方、処理の順番と使用法
モジュールの書き方、処理の順番と使用法
モジュールの使い所

スマホで閲覧されている方へ
このブログは画面横幅を広くしてあります。スマホ解像度での閲覧は厳しいと思いますので、ウェブバージョンへどうぞ。

ポク太郎です。

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

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


Functionの書き方と使用法

関数FUNCTION
関数とは
引数を渡せて、戻り値を返せる処理の塊。ローカル変数を内部で宣言できる。
構文:
FUNCTION 関数名(引数1,引数2,…,引数n)
                (色んな処理)
                RESULT=ほにゃらら
FEND

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

関数を含むプログラム
1
2
3
4
5
6
7
8
9
10
11
FOR i=0 TO 10
         n=関数名(引数1,引数2,…,引数n)
   IF n=(何か)
         (色んな処理)
   ENDIF
NEXT

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

関数部分を別ファイルにするには、以下のようにします。

メインプログラムの先頭でCALL "関数のあるファイル名"とすることで、関数のあるファイルを取り込んで実行します。メインプログラムを実行すると、1行目から開始し、7行目まで実行すると終了します。メインプログラム3行目で関数が呼び出されてますが、処理の順番は、「3行目の実行」=「部品.uws内の2、3行目の実行」です。

メインプログラム.uws
1
2
3
4
5
6
7
CALL "部品.uws"
FOR i=0 TO 10
         n=関数名(引数1,引数2,…,引数n)
   IF n=(何か)
         (色んな処理)
   ENDIF
NEXT
部品.uws
1
2
3
4
FUNCTION 関数名(引数1,引数2,…,引数n)
         (色んな処理)
         RESULT=ほにゃらら
FEND

別フォルダの部品ファイルを指定する方法はこちらの記事[UWSC]関数の定義と呼び出し方[使い方まとめ]をご参考に。


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行目のように“モジュール名.関数名()”と.(ピリオド)で区切って指定します。(ただし、モジュール内の関数から同一モジュール内の関数を呼び出す場合は、“関数名()”のみで指定)

モジュールを含むプログラム
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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行目の値に再セットされます。

モジュール部分を別ファイルにするには、以下のようにします。

メインプログラムの先頭でCALL "モジュールのあるファイル名"とすることで、モジュールのあるファイルを取り込んで実行します。メインプログラムを実行すると、1行目から開始し、7行目まで実行すると終了します。メインプログラム3行目でモジュール内の関数が呼び出されてますが、処理の順番は、「3行目の実行」=「部品.uws内の2、3、6、7行目の実行」です。

メインプログラム.uws
1
2
3
4
5
6
7
CALL "部品.uws"
FOR i=0 TO 10
         n=モジュール名.関数名(引数1,引数2,…,引数n)
   IF n=(何か)
         (色んな処理)
   ENDIF
NEXT
部品.uws
1
2
3
4
5
6
7
8
9
MODULE モジュール名
   PUBLIC pi=3.14159265359
   PUBLIC et=2.71828182846

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

別フォルダの部品ファイルを指定する方法はこちらの記事[UWSC]関数の定義と呼び出し方[使い方まとめ]をご参考に。


Moduleの使い所

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

ではモジュールは?

以下が例です。面積の公式を一まとめにしたモジュールです。このように似通った意味の関数群をグローバル変数付で一まとめにすることができます。
無理矢理モジュール内の関数を使い回そうとして分かり辛くなっていますが、四角形、三角形、台形、円の面積を求める公式をモジュールで一塊にしてみました。

モジュールの例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

プログラムが大きくなってくると、面倒なことが起きてきます。
・最適な関数名が既に使用済
  ⇒ 共通の意味・目的の関数群をモジュールで一塊にする
・どの機能で使用するためのグローバル変数なのか分からなくなる
・関数が大きくなり、その関数専用の別関数を作りたくなる
などでしょうか。

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


Windows マクロテクニック

Windowsを自動化!UWSC逆引き本



記事の内容

記事の内容は伝わりましたでしょうか。
○わかりやすいプログラムを構築するために
関数、プロシージャの書き方、処理の順番と使用法
モジュールの書き方、処理の順番と使用法
モジュールの使い所


【関連記事】
人気![UWSC]関数の定義と呼び出し方[使い方まとめ]
人気![UWSC]配列変数と関数[使い方まとめ]






シェアされると喜びます。

0 件のコメント:

コメントを投稿