こんにちは、ぴよ工房を運営しているぴよ(@piy0_gadget)です!
この記事では、
- サブルーチン(Subroutine)の使い方
- モジュール(Module)の使い方
について話していきます。
サブルーチンとモジュールを使うとコードがスッキリして、プログラムの流れも整理できるため非常に便利です!!
本記事では図とコード例を用いてかなりかみ砕いて説明していきます。
最後まで読んでマスターしてください!!

サブルーチン(Subroutine)
それではサブルーチン(Subroutine)の説明をしていきます。
まずはコード例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Program test Implicit none Call example1 stop End Program Subroutine example1 Implicit none Return End Subroutine |
『End Program』の下に『Subroutine~End Subroutine』がありますね。この『Subroutine~End Subroutine』がサブルーチンと呼ばれるものです。
サブルーチンで出来ることは、基本的にはメインのプログラムで出来る処理と変わりありません。
なら、サブルーチンは必要ないのでは?と思うかもしれませんね。
ぶっちゃけるとサブルーチンがなくてもプログラムを書くことは出来ます。しかし、サブルーチンを使う利点は多大すぎるので、ぜひ使えるようになってください。
以下にサブルーチンとメインのプログラムとの関係を説明して、サブルーチンの利点を話していきます。
まず、『メインのプログラム』と『サブルーチン』の関係は上司と部下のイメージを持って下さい。
これは、『メインのプログラム』という上司がプログラム全体を指揮しており、『サブルーチン』という部下に命令を下している、といった事を表しています。
プログラム全体が小さければメインのプログラムだけで十分ですが、プログラム全体が大きくなるとメインのプログラムだけでは不十分です。
先ほどの上司と部下の例だと、仕事量が多ければ部下に仕事を割り振りますよね。つまり、そういうことです。
『メインのプログラム』と『サブルーチン』は上司と部下の関係!
それでは、もう少しサブルーチンの例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Program test Implicit none Call example1 Call example2 stop End Program Subroutine example1 Implicit none Real*8 pi pi = 3.1415d0 Return End Subroutine Subroutine example2 Implicit none Real*8 pi Real*8 pipi pipi = pi*pi Return End Subroutine |
まず、コードの説明をしていきます。
『Subrotine example1』で円周率πを定義しました。そして、『Subrotine example2』で円周率の二乗を計算しました。
ここで伝えたいのは、『Subrotine example1』と『Subrotine example2』で『Real*8 pi』と宣言していることです。
この宣言は『pi』を共通変数として扱っていることを意味します。
共通変数?って感じですよね。もう少し詳しく説明します。
もし仮に『Subrotine example2』で『Real*8 pi』と宣言しないと、『Subrotine example1』で与えた『pi』の値を使うことが出来ません。
これを解決するためには『Real*8 pi』と宣言する必要があります。
これにより、『Subrotine example1』と『Subrotine example2』の共通の変数として『pi』を使うことが出来ます。
つまり、サブルーチン間で変数を共有するには逐一宣言をする必要があります。
これがちょっと面倒な点ですが安心してください。後述する『モジュール』がこの問題点を解決してくれます。
モジュール(Module)
前述したサブルーチンのコードに追加して、モジュールのコード例を示しますね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Module Definition Implicit none Real*8 pi,pipi End Module Program test use Definition Implicit none Call example1 Call example2 stop End Program Subroutine example1 use Definition Implicit none pi = 3.1415d0 Return End Subroutine Subroutine example2 use Definition Implicit none pipi = pi*pi Return End Subroutine |
『Program~End Program』の上に『Module~End Module』がありますね。この『Module~End Module』がモジュールと呼ばれるものです。
モジュールの役割は前述したとおり、プログラム全体に共通変数を与えることです。
もう少しかみ砕いて説明しますね。
サブルーチンの項でも話しましたが、『メインのプログラム』が上司、『サブルーチン』が部下とするなら、『モジュール』は社長です。
つまり、
- プログラム全体の統括者が『モジュール』
- その指揮をとるのが『メインのプログラム』
- 実際に業務を処理するのが『サブルーチン』
とイメージを持てばそれぞれの役割が分かりやすくなるかと思います。
あとは使い方の注意点ですが、『Program』・『Subroutine』の直後に『use (モジュール名)』と宣言してください。この宣言によってモジュールを使えるようになります。
今回の例だとモジュール名が『Definition』なので、『use Definition』と宣言しています。

まとめ
本記事ではサブルーチンとモジュールの役割について、コード例と図を用いて解説しました。
サブルーチンは他にも便利な機能(引数とか)がありますが、今回はあえて話しませんでした。
いきなりややこしいことをするよりも、まずは役割や使い方をインプットして少しずつ使えるようになってください。急がば回れってやつです。
前回の基礎(『Fortranの基礎1』や『Fortranの基礎2』)と今回の応用は、自分がFortranを使っていてこういった説明が欲しかったなと思う内容になっています。
全てを網羅しているわけではありませんが、プログラムの理解を少しでも担えたら幸いです。
疑問があればリプやDMで気軽にどうぞ!

https://twitter.com/piy0_gadget/status/1251079790548807684?s=20