配列と文字列#

多くの場合、これまで使用してきた単一のスカラー変数だけでなく、数値の長いリストを格納して操作する必要があります。コンピュータプログラミングでは、このようなリストは配列と呼ばれます。

配列は、複数の値を格納する多次元変数であり、各値には1つ以上のインデックスを使用してアクセスします。

Fortranの配列は、デフォルトで1から始まるため、任意の次元の最初の要素はインデックス1になります。

配列宣言#

任意の型の配列を宣言できます。配列変数を宣言するには、dimension属性を使用するか、変数名に括弧で配列次元を追加するという2つの一般的な表記法があります。

例:静的配列宣言

program arrays
  implicit none

  ! 1D integer array
  integer, dimension(10) :: array1

  ! An equivalent array declaration
  integer :: array2(10)

  ! 2D real array
  real, dimension(10, 10) :: array3

  ! Custom lower and upper index bounds
  real :: array4(0:9)
  real :: array5(-5:5)

end program arrays

配列スライス#

Fortran言語の強力な機能は、配列操作の組み込みサポートです。配列スライス表記法を使用して、配列の全部または一部に対して操作を実行できます。

例:配列スライス

program array_slice
  implicit none

  integer :: i
  integer :: array1(10)  ! 1D integer array of 10 elements
  integer :: array2(10, 10)  ! 2D integer array of 100 elements

  array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  ! Array constructor
  array1 = [(i, i = 1, 10)]  ! Implied do loop constructor
  array1(:) = 0  ! Set all elements to zero
  array1(1:5) = 1  ! Set first five elements to one
  array1(6:) = 1  ! Set all elements after five to one

  print *, array1(1:10:2)  ! Print out elements at odd indices
  print *, array2(:,1)  ! Print out the first column in a 2D array
  print *, array1(10:1:-1)  ! Print an array in reverse

end program array_slice

Fortranの配列は、列優先順序で格納されます。最初のインデックスが最も早く変化します。

割付け可能(動的)配列#

これまでは、プログラムコードで配列のサイズを指定してきました。このタイプの配列は、プログラムのコンパイル時にサイズが固定されるため、静的配列と呼ばれます。

多くの場合、たとえば、サイズが不明なファイルからデータを読み取る場合など、プログラムを実行するまで配列のサイズがどの程度必要になるかわかりません。

この問題には、割付け可能配列が必要です。これらは、プログラムの実行中に、配列の必要なサイズがわかってから割り当てられます。

例:割付け可能配列

program allocatable
  implicit none

  integer, allocatable :: array1(:)
  integer, allocatable :: array2(:,:)

  allocate(array1(10))
  allocate(array2(10,10))

  ! ...

  deallocate(array1)
  deallocate(array2)

end program allocatable

割付け可能なローカル配列は、スコープ外に出ると自動的に割り当て解除されます。

文字列#

例:静的文字列

program string
  implicit none

  character(len=4) :: first_name
  character(len=5) :: last_name
  character(10) :: full_name

  first_name = 'John'
  last_name = 'Smith'

  ! String concatenation
  full_name = first_name//' '//last_name

  print *, full_name

end program string

例:割付け可能文字列

program allocatable_string
  implicit none

  character(:), allocatable :: first_name
  character(:), allocatable :: last_name

  ! Explicit allocation statement
  allocate(character(4) :: first_name)
  first_name = 'John'

  ! Allocation on assignment
  last_name = 'Smith'

  print *, first_name//' '//last_name

end program allocatable_string

文字列の配列#

Fortranでは、文字列の配列は、character変数の配列として表現できます。character配列のすべての要素は、同じ長さです。ただし、以下の例に示すように、長さの異なる文字列を配列コンストラクタへの入力として指定できます。文字列がcharacter配列の宣言された長さよりも長い場合は切り捨てられ、短い場合はスペースで右詰めされます。最後に、標準出力に値を出力する際に、組込み関数trimを使用して余分なスペースを削除します。

例:文字列配列

program string_array
  implicit none
  character(len=10), dimension(2) :: keys, vals

  keys = [character(len=10) :: "user", "dbname"]
  vals = [character(len=10) :: "ben", "motivation"]

  call show(keys, vals)

  contains

  subroutine show(akeys, avals)
    character(len=*), intent(in) :: akeys(:), avals(:)
    integer                      :: i

    do i = 1, size(akeys)
      print *, trim(akeys(i)), ": ", trim(avals(i))
    end do

  end subroutine show

end program string_array