サーチ…


組み込み型

Fortranに固有のデータ型は次のとおりです。

integer
real
character
complex
logical

integerrealcomplexは数値型です。

characterは文字列を格納するための型です。

logical値はバイナリ値を格納するために使用されます.true.または.false.

すべての数値と論理の組み込み型は、種類を使用してパラメータ化されます。

integer(kind=specific_kind)

あるいは単に

integer(specific_kind)

ここで、 specific_kindは定数という名前の整数です。

文字型変数は、種類パラメータを持つだけでなく、長さパラメータも持ちます。

character char

charをデフォルトのkindの長さ1文字の変数に宣言します。

character(len=len) name

nameをデフォルトの種類の文字変数と長さlen宣言します。種類も指定できます

character(len=len, kind=specific_kind) name
character(kind=specific_kind) char

宣言するname一種の文字であることをkindや長さlencharはkind kind長さ1の文字です。

あるいは、文字宣言のための古い形式

character*len  name

宣言、古いコードに見られるname長さのものであるとlenとデフォルトの文字種類。


intrinsic型の変数の宣言は上記の形式であるかもしれませんが、 type(...)形式を使用することもできます:

integer i
real x
double precision y

(しかし、それ以上に好ましい)

type(integer) i
type(real) x
type(double precision) y

派生データ型

新しいタイプmytype定義しmytype

type :: mytype
  integer :: int
  real    :: float
end type mytype

mytype型の変数を宣言します:

type(mytype) :: foo

派生型のコンポーネントは、 % operator 1

foo%int = 4
foo%float = 3.142

Fortran 2003の機能(すべてのコンパイラではまだ実装されていません)により、パラメータ化されたデータ型を定義できます。

type, public :: matrix(rows, cols, k)
  integer, len :: rows, cols
  integer, kind :: k = kind(0.0)
  real(kind = k), dimension(rows, cols) :: values
end type matrix

派生型matrixは、型名に続く括弧内の3つの型パラメータ( rowscols 、およびk )があります。各型パラメータの宣言では、それらがkind( kind )型かlength( len )型のどちらであるかを示す必要があります。

インライン・タイプのパラメータのような種類のパラメータは定数式でなければなりませんが、インライン・タイプの変数の長さなどの長さ型のパラメータは実行中に変化する可能性があります。

パラメータkにはデフォルト値があるので、以下のように、 matrix型の変数が宣言されている場合は、省略または省略することができます

type (matrix (55, 65, kind=double)) :: b, c ! default parameter provided
type (matrix (rows=40, cols=50)     :: m    ! default parameter omitted

派生型の名前は、 doubleprecisionなくても、組み込み型のいずれかと同じであってはいけません。


  1. 多くの人々は、Fortranがより一般的ではなくコンポーネントアクセス演算子として%を使用する理由を疑問視しています. 。これは理由があり.すでに演算子の構文、つまり、 .not.によって取り込まれています.not. 、および.and..my_own_operator.

浮動小数点数の精度

real型の浮動小数点数は実際の値を持つことはできません。彼らは10進数の特定の量までの実数を表すことができます。

FORTRAN 77では2つの浮動小数点型が保証されており、より最近の標準では少なくとも2つの実数型が保証されています。実変数は次のように宣言できます。

real x
double precision y

ここでxはデフォルトの種類の実数であり、 yxよりも10進精度が大きい種類の実数です。 Fortran 2008では、 yの小数点精度は少なくとも10で、小数点の指数範囲は少なくとも37です。

 real, parameter             :: single = 1.12345678901234567890
 double precision, parameter :: double = 1.12345678901234567890d0
 
 print *, single
 print *, double

プリント

   1.12345684    
   1.1234567890123457

一般的なコンパイラではデフォルト設定を使用します。

倍精度定数のd0に注目してください。指数を表すためにe代わりにdを含む実数リテラルは、倍精度を示すために使用されます。

! Default single precision constant
1.23e45
! Double precision constant
1.23d45

Fortran 90では、種類を使用してパラメータ付きreal型が導入されました。実際の型の種類は、定数またはリテラル定数と呼ばれる整数です。

real(kind=real_kind) :: x

あるいは単に

real(real_kind) :: x

このステートメントは、 xreal_kindの値に応じて特定の精度でreal型であると宣言します。

浮動小数点型リテラルは、接尾辞を使用して特定の種類で宣言できます

1.23456e78_real_kind

real_kindの正確な値は標準化されておらず、コンパイラごとに異なります。実際の変数や定数の種類を調べるには、関数kind()を使うことができます:

print *, kind(1.0), kind(1.d0)

通常は印刷されます

4 8

または

1 2

コンパイラに依存します。

種類番号はいくつかの方法で設定できます。

  1. 単一(デフォルト)と倍精度:

    integer, parameter :: single_kind = kind(1.)
    integer, parameter :: double_kind = kind(1.d0)
    
  2. 組み込み関数selected_real_kind([p, r])を使用して、必要な10進精度を指定します。返される種類は少なくともp桁の精度を持ち、少なくともr指数を許します。

    integer, parameter :: single_kind = selected_real_kind( p=6, r=37 )
    integer, parameter :: double_kind = selected_real_kind( p=15, r=200 )
    
  3. Fortran 2003からは、組み込みのCコンパイラのfloatdoubleまたはlong_double型と実際の型がインターISO_C_Bindingことを保証するために、組み込み関数ISO_C_Bindingを使用して事前定義された定数を使用できます。

    use ISO_C_Binding
    
    integer, parameter :: single_kind = c_float
    integer, parameter :: double_kind = c_double
    integer, parameter :: long_kind = c_long_double
    
  4. Fortran 2008以降、事前定義された定数は、組み込みモジュールISO_Fortran_env介して利用できます。これらの定数は、ビット単位で特定の記憶容量を持つ実数型を提供します

    use ISO_Fortran_env
    
    integer, parameter :: single_kind = real32
    integer, parameter :: double_kind = real64
    integer, parameter :: quadruple_kind = real128
    

特定の種類がコンパイラで使用できない場合、 selected_real_kind()または整数定数の値によって返される値は-1です。

仮定された遅延型パラメータと遅延型の遅延型パラメータ

長さパラメータを持つ文字型または派生型の変数には、長さパラメータを仮定または遅延させることができます。文字変数name

character(len=len) name

実行中の長さはlenです。逆に、長さ指定子は、

character(len=*) ...  ! Assumed length

または

character(len=:) ...  ! Deferred length

仮定される長さ変数は、別のエンティティからの長さを仮定します。

この関数

function f(dummy_name)
  character(len=*) dummy_name
end function f

ダミー引数dummy_name長さは実際の引数の長さになります。

指定された定数const_name in

character(len=*), parameter :: const_name = 'Name from which length is assumed'

右辺の定数式によって与えられる長さを持つ。


遅延長型パラメータは、実行中に変化する可能性があります。遅延長を持つ変数は、 allocatable属性またはpointer属性のいずれかを持つ必要があります

character(len=:), allocatable :: alloc_name
character(len=:), pointer :: ptr_name

このような変数の長さは、以下のいずれかの方法で設定することができます

allocate(character(len=5) :: alloc_name, ptr_name)
alloc_name = 'Name'         ! Using allocation on intrinsic assignment
ptr_name => another_name    ! For given target

長さパラメータ化を使用する派生型の場合、構文は似ています

  type t(len)
    integer, len :: len
    integer i(len)
  end type t

  type(t(:)), allocatable :: t1
  type(t(5)) t2

  call sub(t2)
  allocate(type(t(5)) :: t1)

contains

  subroutine sub(t2)
    type(t(*)), intent(out) :: t2
  end subroutine sub

end  

リテラル定数

プログラム単位はしばしばリテラル定数を利用する。これらは明らかなケースをカバーします

print *, "Hello", 1, 1.0

1つの場合を除いて、各定数はスカラーであり、型、型パラメーター、および構文によって与えられる値を持ちます。

整数リテラル定数は次の形式です

1
-1
-1_1   ! For valid kind parameter 1
1_ik   ! For the named constant ik being a valid kind paramter

実際のリテラル定数は次の形式です

1.0    ! Default real
1e0    ! Default real using exponent format
1._1   ! Real with kind parameter 1 (if valid)
1.0_sp ! Real with kind paramter named constant sp
1d0    ! Double precision real using exponent format
1e0_dp ! Real with kind named constant dp using exponent format

複雑なリテラル定数は次の形式です

(1, 1.)       ! Complex with integer and real components, literal constants
(real, imag)  ! Complex with named constants as components

実数成分と虚数成分が両方とも整数である場合、複素リテラル定数はデフォルト複素数であり、整数成分はデフォルト実数に変換される。 1つのコンポーネントが実数である場合、複素リテラル定数のkindパラメータは実数のものであり(整数コンポーネントはその実数型に変換される)両方の成分が実際の場合、複雑なリテラル定数は、最も精度の高い実数のものです。

論理定数は次のとおりです。

.TRUE.     ! Default kind, with true value
.FALSE.    ! Default kind, with false value
.TRUE._1   ! Of kind 1 (if valid), with true value
.TRUE._lk  ! Of kind named constant lk (if valid), with true value

文字のリテラル値は、種類指定子が値の前に

"Hello"       ! Character value of default kind
'Hello'       ! Character value of default kind
ck_"Hello"    ! Character value of kind ck
"'Bye"        ! Default kind character with a '
'''Bye'       ! Default kind character with a '
""            ! A zero-length character of default kind

上記のように、文字リテラル定数は、アポストロフィや引用符で区切られなければならず、開始マーカーと終了マーカーは一致する必要があります。リテラルのアポストロフィは、引用符区切り記号の中に入れるか、二重引用符で囲むことで含めることができます。引用符でも同じです。

BOZ定数は、値だけを指定する点で上記とは異なります。型や型パラメータはありません。 BOZ定数はビットパターンで、次のように指定されます。

B'00000'    ! A binary bit pattern
B"01010001" ! A binary bit pattern
O'012517'   ! An octal bit pattern
O"1267671"  ! An octal bit pattern
Z'0A4F'     ! A hexadecimal bit pattern
Z"FFFFFF"   ! A hexadecimal bit pattern

BOZリテラル定数は、 dataステートメントの定数や組み込みプロシージャの選択など、どこに表示されるかに制限があります。

文字部分文字列へのアクセス

文字エンティティ

character(len=5), parameter :: greeting = "Hello"

部分文字列を構文で参照することができます

greeting(2:4)  ! "ell"

1文字にアクセスするには、それを書き込むだけでは不十分です

greeting(1)    ! This isn't the letter "H"

しかし

greeting(1:1)  ! This is "H"

文字配列の場合

character(len=5), parameter :: greeting(2) = ["Hello", "Yo!  "]

私たちのような部分文字列アクセス

greeting(1)(2:4)  ! "ell"

しかし、連続していない文字は参照できません

greeting(:)(2:4)  ! The parent string here is an array

リテラル定数の部分文字列にもアクセスできます

"Hello"(2:4)

文字変数の一部は、部分文字列を変数として使用して定義することもできます。例えば

integer :: i=1
character :: filename = 'file000.txt'

filename(9:11) = 'dat'
write(filename(5:7), '(I3.3)') i

複雑なコンポーネントへのアクセス

複合エンティティ

complex, parameter :: x = (1., 4.)

実数部1.と複素数部4. 。これらの個々のコンポーネントには、

real(x)  ! The real component
aimag(x) ! The complex component
x%re     ! The real component
y%im     ! The complex component

x%..形式はFortran 2008には新しく、コンパイラーで広くサポートされていません。しかし、この形式を使用して、複雑な変数の個々のコンポーネントを直接設定することができます

complex y
y%re = 0.
y%im = 1.

宣言と属性

ここでのトピックと例では、変数や関数などの宣言が多数見られます。

名前だけでなく、データオブジェクトも属性を持つことがあります 。このトピックには、次のような宣言文が含まれています。

integer, parameter :: single_kind = kind(1.)

これはオブジェクトsingle_kindparameter属性を与えます(名前付き定数にします)。

他にも多くの属性があります

  • target
  • pointer
  • optional
  • save

属性は、いわゆる属性指定文で指定することができます

integer i    ! i is an integer (of default kind)...
pointer i    ! ... with the POINTER attribute...
optional i   ! ... and the OPTIONAL attribute

しかし、これらの属性指定ステートメントの使用を避ける方が一般的に良いと考えられています。わかりやすくするために、属性は単一の宣言の一部として指定することができます

integer, pointer, optional :: i

これにより、暗黙の型指定を使用する誘惑も軽減されます。

このFortranのドキュメントのほとんどの場合、この1つの宣言文が優先されます。



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