前へ 上へ 次へ
前へ 上へ 次へ
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
前へ 上へ 次へ
