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