関連情報
ナビゲーション:Fortran 2003入門   前へ   上へ   次へ

3.7 自動再割付け

Fortran 2003では割付け配列全体への代入で、 代入される式が異なる大きさもしくは形状の配列であった場合に、 割付け配列が再割付けされ正しい形状になります(Fortran95ではこのような代入はエラーとなります)。
例:
  ALLOCATE(a(10))
  ...
  a = (/ (i,i=1,100) /)
  ! A is now size 100

同様に、割付け変数が無指定型パラメタ(後のセクションで説明されます) を持つ場合でかつ割付けが行われていないかもしくは式と異なる値を持つ場合には、 割付け変数が再割付けされてその型パラメタと同じ値を持つようになります。 これにより真の可変長文字変数が可能となります。

  CHARACTER(:),ALLOCATABLE :: name
  ...
  name = 'John Smith'
  ! LEN(name) is now 10, whatever it was before.
  name = '?'
  ! LEN(name) is now 1.
割付けオブジェクトの副オブジェクトはそれ自体割付けではないため、この自動再割付け を文字部分列(文字の場合)、あるいは部分配列(配列の場合)を用いて抑止することが できる点に注意ください。
例:
  name(:) = '?'             ! Normal assignment with truncation/padding.
  a(:) = (/ (i,i=1,100) /)  ! Asserts that A is already of size 100.


[ code/deferred-len.f90 ] - 可変長文字変数のサンプル
program DeferredLength
  implicit none
  character(:),allocatable :: x   ! deferred lengthの宣言
  integer n
  n = 6
  allocate(character(n)::x)       ! n文字分の領域確保
  x(:) = "ABCDEFGHIJKLMNOP"       ! x(:)とするとxの再領域確保を行わないで普通の代入(切捨て)となる
  print "(3a)", "'", x, "'"
  x(:) = "ABC"                    ! x(:)とするとxの再領域確保を行わないで普通の代入となる
  print "(3a)", "'", x, "'"
  x = "ABCDEFGHIJKLMNOP"          ! 右辺の長さに合わせて再領域確保が行われる
  print "(3a)", "'", x, "'"
  x = "ABC"                       ! 右辺の長さに合わせて再領域確保が行われる
  print "(3a)", "'", x, "'"
end

出力例:
'ABCDEF'
'ABC   '
'ABCDEFGHIJKLMNOP'
'ABC'


Results matter. Trust NAG.
Privacy Policy | Trademarks