サーチ…


Fortranプログラム

完全なFortranプログラムは、いくつかの異なるプログラム単位で構成されています。プログラム単位は:

  • メインプログラム
  • 関数またはサブルーチンサブプログラム
  • モジュールまたはサブモジュール
  • ブロックデータプログラムユニット

メインプログラムといくつかのプロシージャ(ファンクションまたはサブルーチン)サブプログラムは、Fortran以外の言語で提供される場合があります。例えば、Cのメインプログラムは、Fortranの関数サブプログラムによって定義された関数を呼び出すことができます。あるいは、Fortranのメインプログラムは、Cで定義されたプロシージャを呼び出すことができます。

これらのFortranプログラム単位は、別個のファイルであるか、または単一のファイル内で与えられてもよい。

たとえば、次の2つのファイルが表示されます。

prog.f90

program main
  use mod
end program main

mod.f90

module mod
end module mod

コンパイラ(正しく呼び出された)はメインプログラムをモジュールに関連付けることができます。

1つのファイルには多くのプログラム単位

すべて.f90

module mod
end module mod

program prog
  use mod
end program prog

function f()
end function f()

しかし、この場合、関数fは主プログラムとモジュールに関する限り、依然として外部関数であることに注意する必要があります。ただし、メインプログラムからモジュールにアクセスできます。

入力範囲の規則は、個々のプログラム単位に適用され、それらが含まれているファイルには適用されません。たとえば、各スコープ単位に暗黙の型定義を持たせたくない場合、上記のファイルは次のように記述する必要があります。

module mod
  implicit none
end module mod

program prog
  use mod
  implicit none
end program prog

function f()
  implicit none
  <type> f
end function f

モジュールとサブモジュール

モジュールは他の場所で文書化されています

コンパイラは多くの場合、いわゆるモジュールファイルを生成します

module my_module
end module

コンパイラによってmy_module.modような名前のファイルがmy_module.modされます。そのような場合、モジュールがプログラム単位によってアクセス可能であるためには、このモジュールファイルは、この後者のプログラム単位が処理される前に可視でなければならない。

外部手続き

外部プロシージャーは、別のプログラム単位の外に定義されたもの、またはFortran以外の手段によって定義されたものです。

のようなファイルに含まれる関数

integer function f()
  implicit none
end function f

外部機能です。

外部プロシージャの場合、それらの存在は、インタフェースブロック(明示的なインタフェースが与えられている)を使用して宣言することができます。

program prog
  implicit none
  interface
    integer function f()
  end interface
end program prog

暗黙的なインタフェースを与えるための宣言文

program prog
  implicit none
  integer, external :: f
end program prog

あるいは

program prog
  implicit none
  integer f
  external f
end program prog

external属性は必要ありません。

program prog
  implicit none
  integer i
  integer f
  i = f()   ! f is now an external function
end program prog

ブロックデータプログラム単位

ブロックデータプログラム単位は、共通ブロック内のオブジェクトの初期値を提供するプログラム単位です。これらはここでは文書化されていませんので、歴史的なFortranの機能のドキュメントに記載されています。

内部サブプログラム

他のプログラム単位を含有することができる内部サブプログラムではないプログラム部は、 内部サブプログラムと呼ばれます。

program prog
  implicit none
contains
  function f()
  end function f
  subroutine g()
  end subroutine g
end program

このような内部サブプログラムには、多くの機能があります。

  • サブプログラム内のエンティティと外部プログラムの間にホストアソシエーションが存在する
  • 暗黙の型定義ルールは継承されます( implicit noneは上記のfで有効です)
  • 内部サブプログラムは、ホストで使用可能な明示的なインタフェースを持っています。

モジュール・サブプログラムおよび外部サブプログラムには、内部サブプログラムが含まれる場合があります。

module mod
  implicit none
contains
  function f()
  contains
    subroutine s()
    end subroutine s
  end function f
end module mod

ソースコードファイル

ソースコードファイルは、コンパイラによって処理される(一般的に)プレーンテキストファイルです。ソースコードファイルには、最大1つのメインプログラムと任意の数のモジュールと外部サブプログラムを含めることができます。たとえば、ソースコードファイルには次のものが含まれます

module mod1
end module mod1

module mod2
end module mod2

function func1()    ! An external function
end function func1

subroutine sub1()   ! An external subroutine
end subroutine sub1

program prog        ! The main program starts here...
end program prog    ! ... and ends here

function func2()    ! An external function
end function func2

外部サブプログラムがモジュールとメインプログラムと同じファイルに与えられているにもかかわらず、外部サブプログラムは他のコンポーネントによって明示的に知られていないことに注意してください。

あるいは、個々のコンポーネントを複数のファイルに分散し、異なる時間にコンパイルすることさえできます。複数のファイルを1つのプログラムにまとめる方法については、コンパイラのドキュメントを参照してください。

単一のソースコードファイルには、 固定形式または自由形式のソースコードが含まれていてもかまいません。複数のファイルをコンパイル時に組み合わせても、異なるスタイルを持つこともあります。

ソース形式をコンパイラに示すには、一般的に2つのオプションがあります。

  • ファイル名接尾辞の選択
  • コンパイラフラグの使用

固定または自由形式のソースを示すコンパイル時フラグは、コンパイラーのドキュメントにあります。

重要なファイル名の接尾辞はコンパイラのドキュメントにも記載されていますが、原則としてfile.f90という名前のファイルは自由形式のソースを含んでいますが、 file.fは固定形式のソースを含むものです。

フリーフォームソース(Fortran 90標準で導入されたもの)を示すために.f90サフィックスを使用すると、プログラマはサフィックスを使用して、ソースコードが準拠している言語標準を示すことをしばしば誘惑します。たとえば、 .f03または.f08接尾辞を持つファイルが表示されることがあります。 Fortran 2003のほとんどのソースは、Fortran 77、Fortran 90/5、Fortran 2008にも準拠しています。さらに、多くのコンパイラはこのような接尾辞を自動的には考慮しません。


コンパイラには、(通常、cppに基づいた)組み込みのコードプリプロセッサも用意されています。ここでも、コンパイル前にプリプロセッサを実行すべきであることを示すためにコンパイル時フラグを使用することができるが、ソースコードファイルの接尾辞はそのような前処理要件を示すこともある。

大文字と小文字を区別するファイルシステムの場合、 file.Fファイルは前処理する固定形式のソースファイルとし、 file.F90前処理する自由形式のソースファイルとすることがよくあります。これまでのように、このようなフラグとファイルの接尾辞については、コンパイラーのドキュメントを参照する必要があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow