サーチ…
組み込み型
Fortranに固有のデータ型は次のとおりです。
integer
real
character
complex
logical
integer
、 real
、 complex
は数値型です。
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
や長さlen
。 char
は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つの型パラメータ( rows
、 cols
、および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
なくても、組み込み型のいずれかと同じであってはいけません。
- 多くの人々は、Fortranがより一般的ではなくコンポーネントアクセス演算子として
%
を使用する理由を疑問視しています.
。これは理由があり.
すでに演算子の構文、つまり、.not.
によって取り込まれています.not.
、および.and.
、.my_own_operator.
。
浮動小数点数の精度
real
型の浮動小数点数は実際の値を持つことはできません。彼らは10進数の特定の量までの実数を表すことができます。
FORTRAN 77では2つの浮動小数点型が保証されており、より最近の標準では少なくとも2つの実数型が保証されています。実変数は次のように宣言できます。
real x
double precision y
ここでx
はデフォルトの種類の実数であり、 y
はx
よりも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
このステートメントは、 x
がreal_kind
の値に応じて特定の精度でreal
型であると宣言します。
浮動小数点型リテラルは、接尾辞を使用して特定の種類で宣言できます
1.23456e78_real_kind
real_kind
の正確な値は標準化されておらず、コンパイラごとに異なります。実際の変数や定数の種類を調べるには、関数kind()
を使うことができます:
print *, kind(1.0), kind(1.d0)
通常は印刷されます
4 8
または
1 2
コンパイラに依存します。
種類番号はいくつかの方法で設定できます。
単一(デフォルト)と倍精度:
integer, parameter :: single_kind = kind(1.) integer, parameter :: double_kind = kind(1.d0)
組み込み関数
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 )
Fortran 2003からは、組み込みのCコンパイラの
float
、double
または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
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_kind
にparameter
属性を与えます(名前付き定数にします)。
他にも多くの属性があります
-
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つの宣言文が優先されます。