Fortran Tip集

前へ   上へ   次へ

20 無指定文字長(可変長)文字列の使い方

Fortran 2003以降、可変長の文字列が利用できるようになりました。

無指定長(可変長)文字変数の宣言は以下のように行います。

  character (:), allocatable :: str, str2
これを使って、初めての代入を行うと自動的に必要な文字数分の割付けが行われます。
  str = 'ABC'  ! 3文字分の割付けが行われる

同じ変数に再度代入を行うと再割付けが行われます。

  str = 'Fortran'  ! 7文字分の再割付けが行われる

明示的にallocate文を用いて割付けを行う事も可能です。 この場合、既に割付け済の変数を再度割付ける場合は先にdeallocateしてからallocateを行う必要があります。

  allocate(character(10)::str2)   ! 10文字分の割付け

  deallocate(str2)                ! 再割付けは deallocate + allocate で行う
  allocate(character(20)::str2)   ! 20文字分の割付け

文字の連結も通常通り行えます。従来の固定長文字の場合と異なり、TRIM等による余分な空白処理は不要ですので、より直感的に利用できます。

  str = str // '2003'   ! Fortran2003

以下に無指定長(可変長)文字列の利用を示すサンプルプログラムを示します。 extract_numbersという関数は入力引数に含まれる数字のみを抽出して返す関数ですが、関数内で必要な文字数を算出し、allocate文を用いて、明示的に必要な文字数分の領域を確保しています。

[ deferred-length.f90 ] - 無指定長(可変長)文字列の利用を示すサンプル

program deferredlen_example
  implicit none
  character(:), allocatable :: str, extracted_numbers

  str = 'ABC'           !  allocated upon assignment
  print *, str          !  ABC
  print *, len(str)     !  3

  str = 'Fortran'       !  re-allocated upon re-assignment
  print *, str          !  Fortran
  print *, len(str)     !  7

  str = str // '2003'   !  concatenate
  print *, str          !  Fortran2003
  print *, len(str)     !  11

  extracted_numbers = extract_numbers(str)
  print *, extracted_numbers        !  2003
  print *, len(extracted_numbers)   !  4

contains

  function extract_numbers(input_str) result(numbers)
    character(*), intent(in) :: input_str
    character(:), allocatable :: numbers
    integer :: i, count

    ! First, count the numbers in the string for allocation
    count = 0
    do i = 1, len(input_str)
      if (input_str(i:i) >= '0' .and. input_str(i:i) <= '9') then
        count = count + 1
      end if
    end do

    ! Allocate the result string with the correct length
    allocate(character(count) :: numbers)

    ! Now, extract the numbers
    count = 1
    do i = 1, len(input_str)
      if (input_str(i:i) >= '0' .and. input_str(i:i) <= '9') then
        numbers(count:count) = input_str(i:i)
        count = count + 1
      end if
    end do

  end function extract_numbers

end program deferredlen_example

出力例:
 ABC
 3
 Fortran
 7
 Fortran2003
 11
 2003
 4



前へ   上へ   次へ
関連情報
ご案内
© 鬯ョ�ォ�ス�エ鬯イ�ス�シ螟イ�ス�ス�ス�ス�ス�ス�ス�・鬯ョ�ォ�ス�エ髯晢スキ�ス�「�ス�ス�ス�ス�ス�ス�ス�ャ鬯ゥ蟷「�ス�「髫エ荵暦ソス�ス�ス�ス�ケ髫エ竏オ�コ�ス�ス�、�ス�シ�ス�ス�ス�ケ髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�シ鬯ゥ蟷「�ス�「髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�。鬯ゥ蟷「�ス�「髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�ェ鬯ゥ蟷「�ス�「�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�ォ鬯ゥ蟷「�ス�「髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�ォ鬯ゥ蟷「�ス�「�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�「鬯ゥ蟷「�ス�「髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�ォ鬯ゥ蟷「�ス�「�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�エ鬯ゥ蟷「�ス�「髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�ェ鬯ゥ蟷「�ス�「�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�コ鬯ゥ蟷「�ス�「髫エ雜」�ス�「�ス�ス�ス�ソ�ス�ス�ス�ス鬯ゥ蟷「�ス�「�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�コ鬯ゥ蟷「�ス�「�ス�ス�ス�ァ�ス�ス�ス�ス�ス�ス�ス�ー鬯ゥ蟷「�ス�「髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�ォ鬯ゥ蟷「�ス�「髫エ雜」�ス�「�ス�ス�ス�ス�ス�ス�ス�シ鬯ゥ蟷「�ス�「髫エ謇区ュ難ソス�サ�ス�ク�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ス�ェ鬯ョ�ッ雋�スキ陟主・�スソ�ス�ス�ク鬮」魃会スス�ィ�ス�ス�ス�ス�ス�ス�ス�シ鬮ッ讓奇スコ蛛�スス謇假スソ�ス�ス�ス�ス�ス�ス�、�ス�ス�ス�ス�ス�ス�ス�セ 2024
Privacy Policy  /  Trademarks