3 プログラムの書き方についての規則
3.1 書き方のルール
Fortran プログラムの書き方には2種類(自由形式と固定形式)がありますが、固定形式は古い方法であり、現在は推奨されていませんので、ここでは自由形式の書き方を説明します。- 大文字小文字の区別はありません。 program も PROGRAM も Program もすべて同じに扱われます。
- 1 行は最大 132 文字までです。
- どのカラムから書き始めても問題ありません。
! 以下は全く問題ないコードです program main implicit none integer i , j, k print *, i,j,k end program main
- コメントは "!" を用います。 "!" 以降はその行の末までがコメントとなります。
! この行はコメントです a = a + 1 !ここ以降もコメントです
- 一行に入りきらない場合は "&" を行末に配置して次の行へ継続することが可能です。
! 以下2行は a = a + 1 + 2 と同じ意味を持ちます a = a + 1 & + 2
- 文字列の中での継続は "&" を行末に配置して次の行の最初にも "&" を記述します。
! 以下2行は print *, "Hello World" と同じ意味を持ちます print *, "Hello W& &orld"
- 複数の文をセミコロン ";" で区切る事が可能です。
! 以下はセミコロンで文を区切る例です a = a + 1; b = 5
3.2 Fortranプログラムの構成
3.2.1 プログラム単位と副プログラム
ここで Fortran のプログラムを書く上で理解しておかなくてはならないプログラム単位というものについて説明します。プログラム単位には以下の4つがあります。
- 主プログラム(メインプログラム、program から end program まで)
- 外部副プログラム(関数もしくはサブルーチンでどこにも属さない(contains されない)もの)
- モジュール
- 初期値設定(BLOCK DATA)
プログラム単位は Fortran においてファイル分割が許されている最小の単位でもあります。 例えば主プログラムと外部サブルーチン2つで構成されるプログラムがあった場合に、全てを一つのファイルに記述することも可能ですが、主プログラムと外部サブルーチン2つをそれぞれ別のファイルに記述することも可能です。
プログラム単位の一例として以下に主プログラムの記述例(program 文から end program 文まで)を示します。
program main print *, "This is a complete program!" end program main
(補足)Fortran の文には実行文(print 文など)と非実行文(program 文、end 文など)があります。
各プログラム単位の構成は以下のようになります。
[宣言部] [実行部] [副プログラム部]
(補足)宣言部、実行部、副プログラム部は、この順番で記述される必要があります。
(補足)プログラム単位は個別のソースファイルに記述することが可能です。
主プログラムの書き方は以下のようになります。
[program プログラム名] [宣言部] [実行部] [contains 内部副プログラム] end [program [プログラム名]]
(補足)プログラムの実行は、主プログラムの実行部が上から順番に実行されます。
(補足)Java や C++ などのように宣言部を実行部の中に書くことはできません。(宣言部 → 実行部の順番になります。)
【Hello World はこれでも良い - program 文の省略も可能】 print *, "Hello World!" end program hello
【誤った例 - 実行部の中に宣言が入っている】 program main integer a ! 宣言 a = 1 ! 最初の実行文 integer b ! ここで宣言は許されていない b = 2 print *, a+b end
【主プログラムが内部副プログラムを含む例】 program main ! 主プログラム(プログラム単位) implicit none integer i ! 宣言部 i = 99 ! 実行部 call mysub(i) ! 内部副プログラムを呼び出している contains ! contains 文で区切る subroutine mysub(a) ! 内部副プログラム integer a print *, a end subroutine mysub subroutine my2ndSub(a) ! 複数定義する場合はこのように続ければ良い integer a print *, a*2 end subroutine my2ndSub end program main
外部副プログラムの書き方は以下のようになります。
【サブルーチンの場合】 subroutine サブルーチン名 [宣言部] [実行部] [contains 内部副プログラム] end [subroutine [サブルーチン名]] 【関数の場合】 function 関数名 [宣言部] [実行部] [contains 内部副プログラム] end [function [関数名]]
【外部副プログラムが内部副プログラムを含む例】 subroutine myextsub(x) ! 外部副プログラム(プログラム単位の一つ) implicit none integer x ! 宣言部 print *, myfunc(x) ! 内部副プログラムを呼び出している contains ! contains 文で区切る function myfunc(b) ! 内部副プログラム integer myfunc, b myfunc = b + 1 end function myfunc end subroutine myextsub
3.2.2 副プログラムの種類
ここで副プログラムの種類について説明します。 プログラム単位の一つとして外部副プログラムがありますが、実はその他にも内部副プログラムとモジュール副プログラムというものがあり、それぞれ以下のような特徴を持っています。- 外部副プログラム(プログラム単位の一つ。何にも含まれない。内部副プログラムを含むことができる。)
- 内部副プログラム(主プログラム、外部副プログラム、もしくはモジュール副プログラムに含まれる。内部副プログラムを含むこと(ネスト)はできない。)
- モジュール副プログラム(モジュールに含まれる。内部副プログラムを含むことができる。)
プログラム単位と副プログラムの概念を図で示すと以下のようになります。
【モジュール副プログラムについて】
モジュールに関しては主プログラムや外部副プログラムとは異なりモジュール内にモジュール副プログラムを定義し、更にその内部に内部副プログラムを持たすことが可能です。
例1はモジュールにモジュール副プログラムを持たせる例で、例2はモジュールにモジュール副プログラムを持たせ、更にその内側に内部副プログラムを持たせる例です。 (※ モジュールについては後章で詳細を説明します。)
例1 module xyz ! モジュール(プログラム単位) ... contains ! contains 文で区切る function mymodfunc(c) ! これはモジュール副プログラム(内部副プログラムではない) ... end function mymodfunc end module xyz 例2 module xyz ! モジュール(プログラム単位) ... contains ! contains 文で区切る function mymodfunc(c) ! これはモジュール副プログラム(内部副プログラムではない) ... contains ! contains 文で区切る funtcion myinternalfunc(d) ! これが内部副プログラム ... end function myinternalfunc end function mymodfunc end module xyz
前へ 上へ 次へ