2016-09-15 6 views
1

GNU Fortranコンパイラのドキュメントでは、特定の組み込み関数に対して、標準があります。例えば、CPU_TIMEは、標準がFortran 95以降であることが示されている固有の手順です。私の質問はこれの意味です。Fortran標準と組み込み手続き標準

Fortranの標準は、コードを標準準拠(Fortran 77,90,95,2003または2008)に定義するための規則のようなものであると理解しています。 CPU_TIMEはFortran 95+でのみ使用できますか?実際には、私はすでに答えを知っていますが、をコンパイラなしで.f拡張子のFortran 77ファイル内で使用して、Gfortranバージョン> 5でコンパイルすることができます。コンパイラは、コード?私は-stdフラグについて認識していますが、例えばFortran 77コードがFortran 77の組み込みプロシージャーだけを使用していることをどのように確認できますか?

+2

あなたが混乱していると思うことの1つは、.f vs .f90ファイルの意味です。ファイル拡張子は、フリーフォームまたは固定フォームの書式設定にのみ関連しています。 gfortran main.fと入力しても、F77コンパイラを使用しているわけではありません。 – Ross

+0

@Ross:私は自由形式/固定形式とファイルの拡張を認識していますが、 'gfortran main.f 'とタイプするとFortran 77コードがコンパイルされると思いました。コンパイラが実際にコンパイルするFortran(77,90など..)の種類と標準との関係の違いを理解するのは難しいです。 – Coriolis

+1

古いレガシーコンパイラと互換性がある必要がある場合は、最も確実なチェックはコンパイラで確認することです。それ以外の場合は、古い標準とのコンプライアンスを維持することになぜ気がかかるのでしょうか。 – agentp

答えて

2

簡単な答えでは、f95以下の標準をgnuコンパイラと区別することはできません。 f95以降では、-stdオプションを使用してコンパイラに上記の標準の機能をエラーとして認識させることができます。

長い答え:

-std = STD 'のf95' の一つとすることができるプログラムが従うべき基準を、指定し、「F2003:

documentation of gnu compilerは、この言います'、' f2008 '、' gnu '、' legacy 'のいずれかです。 stdのデフォルト値は 'gnu'で、 GNU Fortranでサポートされているすべての拡張を含む Fortran 95標準のスーパーセットを指定しますが、新しいコードでの使用は推奨されていません。 'legacy'の値は と同等ですが、古い拡張機能に関する警告は表示されず、古い非標準プログラムの場合は と便利です。 'f95'、 'f2003'および 'f2008'の値 は、それぞれFortran 95、Fortran 2003およびFortran 2008標準に厳密に準拠しています。すべての拡張子 に該当する言語標準を超えてエラーが表示され、後で 規格で許可され廃止された Fortran 77の機能に対して警告が表示されます。 '-std = f2008ts'は、 にさらに の技術仕様(TS)29113の追加を含むFortran 2008標準と、FortranのCとの相互運用性と追加の並列の のTS 18508の機能をFortranでサポートします。

- `-std=f95` will consider features above f95 as errors 
- `-std=f2003` will consider features above f2003 as errors 
- `-std=f2008` will consider features above f2008 as errors 
- etc. 

あなたは他のコンパイラに確認することをお勧めします。

簡単確認:オプション-std=f95の有無にかかわらず、次のプログラム(Fortran wiki)をコンパイルし、何が起こるかを確認してください。

module class_Circle 
    implicit none 
    private 
    real :: pi = 3.1415926535897931d0 ! Class-wide private constant 

    type, public :: Circle 
     real :: radius 
    contains 
     procedure :: area => circle_area 
     procedure :: print => circle_print 
    end type Circle 
contains 
    function circle_area(this) result(area) 
     class(Circle), intent(in) :: this 
     real :: area 
     area = pi * this%radius**2 
    end function circle_area 

    subroutine circle_print(this) 
     class(Circle), intent(in) :: this 
     real :: area 
     area = this%area() ! Call the type-bound function 
     print *, 'Circle: r = ', this%radius, ' area = ', area 
    end subroutine circle_print 
end module class_Circle 


program circle_test 
    use class_Circle 
    implicit none 

    type(Circle) :: c  ! Declare a variable of type Circle. 
    c = Circle(1.5)  ! Use the implicit constructor, radius = 1.5. 
    call c%print   ! Call the type-bound subroutine 
end program circle_test 
関連する問題