Fortran/基本

提供: testwiki
ナビゲーションに移動 検索に移動

テンプレート:Nav

Introduction

Fortranのプログラムはメインプログラムとモジュールで構成され、それぞれにサブルーチンと関数を含めることができます。 プログラムの実行時に実行されるべきコードは、次のようにprogramブロックに入れます。

program name_of_program
  ! <variable declarations> ...
  ! <program statements> ...
end program

インデントは必須ではありませんが推奨します。プログラム名はアルファベットで始まり、アルファベット、数字、アンダースコア( _ )を含むことができます。 各文は行の終わりで終了します。

プログラム名(上記コード例では name_of_program の部分)や変数名には Fortran の標準規格による文字数制限があり、Fortran 90以降は31文字[1]、Fortran 2003以降は63文字です[2]。 Fortran 90より前のFORTRAN 77などは 6 文字でしたが、Fortran 90より前は自由形式はまだありませんでした。

自由形式と固定形式

FORTRAN 77の構文では、コマンドの前に6つのスペースを置く必要があります。この6つのスペースは、パンチカード版のFORTRANに由来するものです。最初の6つのスペースの後に、必要に応じてインデントのための追加のスペースを置くことができます。

ただし、行の幅は最大で72文字(最初の6つのスペースを含む)までとなっています。余分なスペースが必要な場合は、6列目に任意の文字(一部のコンパイラでは0を除く)を入れることができますが、これを「継続文字」と呼ばれ、パンチカードでは、2枚目のカードに行を続けることができることを意味します。

C2345678...
      PRINT *,"This is a really....
     *...long line.

一部のコンパイラでは、「固定形式」モードではなく「自由形式」を指定することで、6スペースルールをオフにしたり、固定長の行をオフにしたりすることができます。 GNU Fortranコンパイラ(gfortran)を使用している場合、同じ目的のためにコンパイル時に -ffree-form コマンドラインオプションを使用することができます。

コメント

行に !(感嘆符)を入れると、その行の残りの部分は次のようにコメントになります。

 a = b ! this is a comment
 c = d ! this!! is also a comment

固定形式では、最初の列に * あるいは c を置くことで、一行全体をコメントとしてマークすることができます。

変数

テンプレート:Main

変数には、さまざまな種類やオプションがありますが、ここでは基本的なことを説明します。

real       :: a  ! Decimal number.
integer    :: b  ! Whole number.
character  :: c  ! Single character.

すべてのプログラム変数の明示的な宣言を強制することによるタイプミスを防ぐために、変数宣言よりも先にimplicit none文を使用することをお勧めします。

数学演算子

加算、減算、乗算、除算
  +
  -
  *
  /
代入
  =
累乗
2**4 は 2 の 4 乗 = 16
  **

数学の演算子には、一定の優先順位があります。

** は常に最初に来ます、右から左への結合です。

例) 2**3**2 = 512, 64ではありません。

次に、*(乗算)と / (除算)があります。これらは左から右への結合です。

つまり、1.0/1.0/2.0*6.0 = ((1.0/1.0)/2.0)*6.0 = 3.0 であって、12.0 ではありません。

次の順番は、+(加算)と -(減算)です。これらは左から右への結合なので、x-y+z = (x-y)+z = x+(-y)+zとなります。

最後は、= [代入]です。

組込み関数

Fortranには、sinexplogなど、数値計算に便利な関数が豊富に用意されています。関数の引数は適切な型でなければならず、それは括弧で囲まれます。

x = sin(3.14159) ! Sets x equal to sin(pi), which is zero.

Fortranの数学関数はelemental[3]であり、スカラだけでなく配列も引数に取り、スカラまたは同じ形の配列を返すことができます。

real :: x(2), pi=3.14159
x = sin([pi, pi/2])

上のコード片は、配列xの2つの要素、x(1)x(2)を、それぞれsin(pi)sin(pi/2)に設定します。

比較演算子と論理演算子

if文などでは、関係演算子の=<>をそれぞれ.eq..lt..gt..le..ge..ne.と表記することができます。これらの演算子の別の書き方は、それぞれ==<><=>=/=となります。

また、論理演算子の.and..or..not.や、論理定数の.true..false.も使うことができます。 これらの項目を組み合わせる際には、ドットを二重にしてはいけません。例えば、a .and. .not.bは、a.and.not.bと同じですが、a.and..not.bではありません。

WRITE文

テンプレート:Main

write (*,*) "Hello World", variablename, "More text", anothervariable

(*,*)は、デフォルトの出力をデフォルトのオプションで使用することを意味し、通常はprint to screenを使用します。 引用符で囲まれたものは、コード内での見た目通りに出力され、変数の値も出力されます。オブジェクトはカンマで区切らなければならず,write文はデフォルトで自動的に改行されます。

完全な正式な構文は以下の通りです。

write (unit=unit_num, FMT=fmt_label, err=label) "Hello World", variablename, "More text", anothervariable

なお、Fortranのバージョンによっては、ダブルクォートが使えず、シングルクォートが必要なものもあります。 シングルクォートで囲まれたものは、二重にすることで表現できます。 例えば、'don''t'のようになります。

WRITEまたはREADの最初の括弧付き引数は、ユニット番号です。 ユニット番号は、オペレーティングシステムによって決定された方法で、入力または出力ストリームに関連付けられます。 非常に古いシステムでは、ユニット・ナンバーはデバイス・アドレスです。 IBM JCLシステムでは、ユニット番号とファイルの関連付けは、JCLのDDステートメント(Define data; データ定義)で行われます。 他のバージョンでは、ファイルとユニットを関連付ける何らかのステートメントがあります。 UNIT=タグは省略してもよい。 ユニット番号にアスタリスクが使われている場合、関係するI/Oは標準入力チャネル、または標準出力チャネルです

WRITEまたはREADの2番目の括弧付きの引数は、レコード番号です この引数がある場合には、ユニット番号とシングルクォートで区切られることに注意してください。 この変数があると、どのレコード番号から読み込んだり書き込んだりするかを定義します。 例えば、以下のようになります。

record_number = 5
write (2, record_number) x, y, z

x, y, zをマシン固有のフォーマットにパックしてレコード番号5に書き込みます。 もちろん、この使い方をするには、OSやFortranコンパイラがレコードの構成を知っている必要があることに注意してください。 バイト編成のファイルでは、上記のコードはファイルのバイト番号5からx, y, zを書き込むことになります。

WRITEまたはREADの3番目の括弧付き引数は、フォーマット番号です この3番目の引数が上のようにアスタリスクとして存在する場合、フォーマットは明らかにデフォルトです。 もし、入力や出力のフォーマットにFORMAT文を使いたい場合は、FORMAT文のステートメント番号を入れます。 例えば、次のようになります。

write (7,1) 'Hello, world!', i, 'More text', x
1 format (A,I,A,F)

format文は、インライン文としては実行できないことに注意してください。 readwriteで参照される場合にのみ使用されます。 fmt=タグは省略可能です。 また、引数全体を省略することもできます。 ただし、format引数を省略した場合は、マシン固有のパックされたデータを使って、フォーマットされていない状態でI/Oが実行されます。

WRITEまたはREADの最後の括弧付き引数は、エラー・ハンドラ・ステートメント・ラベルです 例えば、次のような場合

write (5,err=2) x, y, z

がコーディングされている場合、これは出力がユニット5にアンフォーマットされることを意味します。 エラーが発生した場合は、ステートメント2(ステートメントラベルの前に2がついているステートメント)で実行を継続します。 エラーが発生し、ERR=の引数がない場合は、プログラムが異常終了します。 このように、ERR=は、他の言語のcatchに最も近いものです。 この最後の引数は完全に省略することができますが、ERR=は一度使った引数を省略することはできません。

Example Code

テンプレート:Main

nearlyuseless
program nearlyuseless
   implicit none

   real    :: temperature
   integer :: cows

   temperature = 98.6
   cows = 9
   print *, "There are ", cows, " cows outside."
   print *, "You are probably ", temperature, " right now"
end program
実行結果
 There are            9  cows outside.

 You are probably    98.5999985      right now

Fortranの一部のバージョン、または一部の設定では、フォーマット文字を使用します。 フォーマット文字が使われている場合、行の最初の文字がその行の印刷方法を決定します。 1は、新しいページを意味します。 0は、行の前に2ラインフィード(ダブルスペース)を意味します。 -は、行の前に3ラインフィード(トリプル・スペース)を意味します。 +は、行の前にラインフィードがない(オーバープリントする)ことを意味します。 そして、スペースは、行の前に1回のライン・フィードを意味します(通常の印刷)。

これは、同じプログラムを古風な形で、このフォームコントロール文字を使ったものです。

oldfasshon
temperature = 98.6
i_cows = 9
write (*,*) 'There are ', i_cows, ' cows outside.'
write (*,*) 'You are probably ', temperature, ' right now.'
end
実行結果
 There are            9  cows outside.

 You are probably    98.5999985      right now.

脚註

  1. テンプレート:Cite book
  2. テンプレート:Cite book
  3. elementalは、Fortranのキーワードで、関数に配列が渡された時、要素毎に処理が行われます。関数自身はスカラを受け取りスカラを返す実装が求められます。