Navigation : Top / Fortran 標準コーディングルール

  • The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
source http://www.mri-jma.go.jp/Project/mrinpd/coderule.html 

抜粋

* Fortran 標準コーディングルール [#g9edb72c]
*** フリーフォーマット(自由形式) [#q30f9b0e]
- 7-72桁に文を書かなければならない等の制約がなくなり、それ以外の桁位置 に書いた文字が無視されるなどの誤りを防ぐことができる。

*** 1ファイルには同名のプログラム単位1つを格納 [#qdae5692]
- プログラム単位とは、主プログラム、外部関数、外部サブルーチン、モジュ ール、BLOCKDATA のいずれかである。たとえば、外部サブルーチン SUB は sub.f90 に保存されるべきである。
こうしておけばプログラムを読むときにファイルを探しやすい。また、サブ ルーチンを書き換えた場合に他のプログラム単位をコンパイルしなおすこと がなくなるので、コンパイル時間が短くなる。

*** 名前 [#j86fc391]
- いつも主プログラムは program 文ではじめること。また end 文としては "end program name" や "end subroutine name" 等の形を使 用すること。

*** 字下げ(インデンテーション) [#t1fc5b47]
- 読みやすさのため、2桁づつの幅で字下げすること。字下げとはプログラム の構造上ひとまとまりとなる文をそのほかの文に比べて2字右側の桁位置から書き始めることである。
字下げを行う「まとまり」とはプログラム単位(subroutine)、引用使用宣言(interface)、実行部ブロック(do, if など)である。これらの終わりの文はすべて「end」で始まる文なので、「end まで字下げ」と覚えれば簡単である。
字下げされた範囲の中の注釈行も字下げすること。これによって、行頭の空白でない最初の桁位置を追うだけでプログラムのアルゴリズム構造が見出せ るようになる。
継続行は開始行に対して2字字下げすること。

*** 空白 [#r9dd8dee]
- 読みやすさのため、名前と演算子など、字句の間に適切な空白を入れ、同じ スタイルを一貫して用いること。英文タイプの句読法に従うのが望ましい。
-- 演算子の前後に空白を入れる。(例: 1 + 2)
-- コンマ、コロン、セミコロンの後に空白を入れる。(例: a, b, c)
-- 括弧類の内側に入れない。(例: array(index))
- またブロックではない一群の文は前後の文との間に空行を入れて区別すること。
空白は原則として1個とするが、似たような構成の代入文が連続するときに 余分な空白をいれて等号の桁位置をそろえ、類似性を見比べやすくするなど してもよい。

*** implicit none [#td2966ab]
- すべてのプログラム単位の冒頭(use 文があるときはその直後) に implicit none 文を書くこと。そしてすべての変数・定数は明示的に宣言すること。 これによって、宣言されていない名前を用いるとコンパイルエラーを起こす ので、名前のつづり間違えによるバグを防ぐことができる。

*** 1行に複数の文を書かない [#zf5ceda9]
- プログラムがわかりにくくなる。

*** 変数の宣言方法 [#ed66f5ca]
- FORTRAN 77 では型宣言文と属性を与えるための文 (SAVE, DATA, DIMENSION, PARAMETER, など) が別であったため、同じ名前の列を何度も書く必要が あった。Fortran 90 では型宣言文で属性をすべて設定できるようになった ため、すべての属性を型宣言文で指定すること。たとえば以下の3つのコー ドはまったく等価である。
 昔ながらの書き方 	
 昔ながらの書き方 	
      INTEGER N
      DIMENSION N(2)
      SAVE N
      DATA N / 400, 224

 推奨する書き方 	
 integer, save:: n(2) = (/400, 224/)

 ×推奨しない書き方 	
 integer, save, dimension(2):: n = (/400, 224/)

上記例3行目のような、型宣言文の dimension 属性は使わないこと。 代わりに2行目のような書き方を用いること。

*** 引数の入出力特性 [#je47d1e4]
- 識別を容易にするためintent(in), intent(out), intent(inout) をつける。 例えば intent(in) がつけられた変数の値を変更する文が存在すると、コン パイル時にエラーが発生し、デバッグを助ける。
- なお、手続のモジュール化または interface ブロックによって引用仕様を 明示することにより、さらにその恩恵を受けることが可能である。

*** 入出力のフォーマット情報 [#odf22b1e]
- 文番号を伴ったformat 文は禁止する。代わりに入出力文の fmt 指定子に記 述すること。

*** 配列表記 [#ob12b3a9]
- プログラムの行数が少なくなるので、可能であれば使用すること。配列か変 数かの区別をつけて読みやすくするため、カッコ内に配列の形状を示すこと。
 昔ながらの書き方 	
 昔ながらの書き方 	
      DIMENSION(N) X, Y
      DO 300 I = 1, N
        X(I) = Y(I)
      300 CONTINUE

 ◎推奨する書き方 	
 real:: x(n), y(n)
 x(1:n) = y(1:n)

 ×推奨しない書き方 	
 x(:) = y(:) または x = y

*** goto 文 [#u001bcc2]
- goto 文を使うとプログラムがわかりにくくなることが多い。Fortran に限 らず、ほとんどのプログラムはループと条件分岐だけで書くことができ、そ うすることが望ましいと考えられている(構造化プログラミング)。
- FORTRAN 77 では固定長のループしか表現できないため GOTO 文を用いる必 要があったが、do のあとの繰り返し指定を省略すると無限ループを表し、 ループの途中からの脱出は exit 文で行えるようになったので、構造化プロ グラミング理論で用いられるすべてのループが GOTO 文なしで書ける。