関連情報

ナビゲーション:前へ   上へ   次へ

3 プログラムの書き方についての規則

3.1 書き方のルール

Fortran プログラムの書き方には2種類(自由形式と固定形式)がありますが、 固定形式は古い方法であり、現在は推奨されていませんので、ここでは自由形式の書き方を 説明します。
  • 大文字小文字の区別はありません。 programPROGRAMProgram もすべて同じに扱われます。
  • 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 [プログラム名]]

(補足1) プログラムの実行は、主プログラムの実行部が上から順番に実行されます。
(補足2) 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



ナビゲーション:前へ   上へ   次へ

Results matter. Trust NAG.
Privacy Policy | Trademarks