2004/12/04 森川靖大
dc_string は文字列を操作するためのサブルーチン群を持つモジュールです。
integer function StoI(string, default) result(result) character(len = *), intent(in) :: string integer, intent(in), optional :: default end function
string で与えられる文字型変数を、整数型変数にして返します。 もしも string が数値に変換できない場合、default が返ります。 default を指定しない場合は 0 が返ります。
double precision function StoD(string) result(result) character(len = *), intent(in):: string end function
string で与えられる文字型変数を、倍精度実数型変数にして返します。 もしも string が数値に変換できない場合、0.0 が返ります。
subroutine Get_Array(int_ptr, string) integer, pointer :: int_ptr(:) character(len = *), intent(in) :: string end subroutine
string で与えられる文字型変数をカンマ「,
」で区切り、
整数型配列ポインタ int_ptr(:) にして返します。
int_ptr(:) はポインタになっているので、配列サイズは string
の内容に応じて自動的に決まります。
subroutine Get_Array(real_ptr, string) real, pointer :: real_ptr(:) character(len = *), intent(in) :: string end subroutine
string で与えられる文字型変数をカンマ「,
」で区切り、
単精度実数型配列ポインタ real_ptr(:) にして返します。
real_ptr(:) はポインタになっているので、配列サイズは string
の内容に応じて自動的に決まります。
subroutine Get_Array(real_ptr, string) double precision, pointer :: real_ptr(:) character(len = *), intent(in) :: string end subroutine
string で与えられる文字型変数をカンマ「,
」で区切り、
倍精度実数型配列ポインタ real_ptr(:) にして返します。
real_ptr(:) はポインタになっているので、配列サイズは string
の内容に応じて自動的に決まります。
logical function Stor_to_Logical(string) result(result) character(len = *), intent(in) :: string end function
string で与えられる文字型変数を論理型にして返します。
string が、 空、 または 0
、 0.0
、
0.0D0
、 0.0d0
、 .false.
、
.FALSE.
、 f
、 F
、
false
、 FALSE
の場合には .false.
が返ります。
それ以外の場合には .true.
が返ります。
character(32) function toChar(i) result(result) integer, intent(in) :: i end function character(500) function toChar(ibuf) result(result) integer, intent(in) :: ibuf(:) end function character(32) function toChar(x) result(result) real, intent(in) :: x end function character(500) function toChar(rbuf) result(result) real, intent(in) :: rbuf(:) end function character(32) function toChar(d) result(result) double precision, intent(in) :: d end function character(500) function toChar(dbuf) result(result) double precision, intent(in) :: dbuf(:) end function
整数型変数 i 、整数型配列 ibuf(:) 、
単精度実数型変数 x 、単精度実数型配列 rbuf(:) 、
倍精度実数型変数 d 、倍精度実数型配列 dbuf(:)
で与えられる数値を文字型変数にして返します。
配列が与えられる場合、各要素をカンマと空白「,
」
で区切って返します。
character(string) function JoinChar(carray, expr) result(result) character(*) , intent(in) :: carray(:) character(*) , intent(in), optional :: expr end function
文字型配列 carray に与えた複数の文字列を「,
」
で区切った1つの文字列にして返します。
expr に文字列を与えると、その文字列を区切り文字として用います。
integer function Index_Ofs(string, start, substr) result(result) character(len = *), intent(in) :: string integer, intent(in) :: start character(len = *), intent(in) :: substr end function
文字列 string の start 文字目以降の文字列の中に substr の文字列が 含まれている時、その開始文字位置を返します。 含まれない場合は 0 を返します。 返される開始文字位置は文字列 string の先頭から数えます。
function Replace(string, from, to) result(result) character(len = 500) :: result character(len = *), intent(in) :: string, from, to end function
文字列 string に文字列 from が含まれる場合、その部分を文字列 to に置換して返します。文字列 from が含まれない場合は string をそのまま返します。 from が複数含まれる場合、先頭の from のみが置換されます。
subroutine toUpper(ch) character(len = *), intent(inout):: ch end subroutine
文字列 ch に英字が含まれる場合、その英字を大文字に変換して ch に返します。 英字でない文字や既に大文字になっている文字はそのまま返します。
character(string) function UChar(ch) result(result) character(len = *), intent(in):: ch end function UChar
文字列 ch に英字が含まれる場合、その英字を大文字に変換して返します。 英字でない文字や既に大文字になっている文字はそのまま返します。
subroutine toLower(ch) character(len = *), intent(inout):: ch end subroutine
文字列 ch に英字が含まれる場合、その英字を小文字に変換して ch に返します。 英字でない文字や既に小文字になっている文字はそのまま返します。
character(string) function LChar(ch) result(result) character(len = *), intent(in):: ch end function LChar
文字列 ch に英字が含まれる場合、その英字を小文字に変換して返します。 英字でない文字や既に小文字になっている文字はそのまま返します。
logical function StriEq(string_a, string_b) result(result) character(len = *), intent(in):: string_a character(len = *), intent(in):: string_b end function
文字列 string_a と文字列 string_b を比較し、同じものならば
.true.
を、異なる場合には .false.
を返します。
ただし、この関数は英字の大文字、小文字を同じ文字として処理します。
logical function StrHead(whole, head) result(result) character(len = *), intent(in):: whole character(len = *), intent(in):: head end function
文字列 head と文字列 whole の先頭部分 (head と同じ文字列長)
とを比較し、同じものならば
.true.
を、異なる場合には .false.
を返します。
whole の文字列長が head の文字列長よりも短い場合には
.false.
を返します。
function CPrintf(fmt, i, r, d, L, s, n, c1, c2, c3) result(result) character(len = string) :: result character(*), intent(in) :: fmt integer, intent(in), optional :: i(:), n(:) real, intent(in), optional :: r(:) double precision, intent(in), optional :: d(:) logical, intent(in), optional :: L(:) type(VSTRING), intent(in), optional :: s(:) character(*), intent(in), optional :: c1, c2, c3 end function
フォーマット文字列 fmt に従って文字列を返します。
第1引数 fmt は「"
」で囲まれ、
その中に出力したい文字列と後続する引数のフォーマット指定を書きます。
フォーマット指定には「%
」を用います。
フォーマット指定したものについては、
その1つ1つについて対応する引数がなくてはなりません。
以下に、フォーマット指定子と引数の対応を記します。
フォーマット指定子 対応する引数 出力形式 表示桁数や形式 %d
、%D
i(:)
整数データ (10 進数) 20 桁 %o
、%O
i(:)
8 進数データ 20 桁 %x
、%X
i(:)
16 進数データ 20 桁 %f
、%F
d(:)
倍精度実数データ 全桁数 80、小数部の桁数 40 %r
、%R
r(:)
単精度実数データ 全桁数 80、小数部の桁数 40 %b
、%B
L(:)
論理データ 真: T
、偽:F
%y
、%Y
L(:)
論理データ 真: yes
、偽:no
%s
、%S
s(:)
VSTRINGデータ %c
、%C
c1
、c2
、c3
文字データ
文字データ以外は、1つの型のデータをいくつでも与えることが可能です。
文字データは c1
、c2
、c3
にそれぞれ1つづつの文字データしか与えることができません。
また、フォーマット指定子として「%*
」を与えることで、
複数のデータを一度に出力することも可能です。
その場合、いくつのデータを一度に出力するかを n(:)
に与える必要があります。
以下に、CPrintf を用いた出力の例を紹介しておきます。
use gt4f90io use dc_types, only: string use dc_string, only: CPrintf character(len = string) :: output, color="RED", size="Large" integer, parameter :: n1 = 2, n2 = 3 integer :: int = 10, arrayI1(n1), arrayI2(n2), i real :: arrayR(n1) logical :: eq do, i = 1, n1 arrayI1(i) = 123 * i arrayR(i) = 1.23 * i enddo do, i = 1, n2 arrayI2(i) = 345 * i enddo eq = (maxval(arrayI1) == minval(arrayI2)) output = CPrintf(fmt="color=%c size=%c int=%d I1=%*d I2=%*d R=%*r equal=%y", & & c1=trim(color), c2=trim(size), i=(/int, arrayI1, arrayI2/), & & r=(/arrayR/), L=(/eq/), n=(/n1, n2, n1/)) write(*,*) trim(output)
文字データ以外のものは基本的に1次元配列しか引数にとれないため、 多次元配列を出力したい場合には組込み関数である pack 関数を 用いると良いでしょう。以下にその例を記します。
use gt4f90io use dc_types, only: string use dc_string, only: CPrintf character(len = string) :: output integer :: i,j,k integer, parameter :: n1 = 2, n2 = 3, n3 = 4 real :: array(n1,n2,n3) do, i = 1, n1 do, j = 1, n2 do, k = 1, n3 array(i,j,k) = i * 0.1 + j * 1.0 + k * 10.0 enddo enddo enddo output = CPrintf('array=<%*r>', & & r=(/pack(array(:,:,:), .true.)/), n=(/size(array(:,:,:))/)) write(*,*) trim(output)
subroutine Printf(unit, fmt, i, r, d, L, s, n, c1, c2, c3) character(*), intent(out) :: unit character(*), intent(in) :: fmt integer, intent(in), optional :: i(:), n(:) real, intent(in), optional :: r(:) double precision, intent(in), optional :: d(:) logical, intent(in), optional :: L(:) type(VSTRING), intent(in), optional :: s(:) character(*), intent(in), optional :: c1, c2, c3 end subroutine subroutine Printf(unit, fmt, i, r, d, L, s, n, c1, c2, c3) integer, intent(in), optional :: unit character(*), intent(in) :: fmt integer, intent(in), optional :: i(:), n(:) real, intent(in), optional :: r(:) double precision, intent(in), optional :: d(:) logical, intent(in), optional :: L(:) type(VSTRING), intent(in), optional :: s(:) character(*), intent(in), optional :: c1, c2, c3 end subroutine
フォーマット文字列 fmt に従って文字列を返します。 (1) 引数 unit に文字型を与えた場合、 文字列は unit に返され、 (2) 引数 unit に整数型を与えた場合、 装置番号 unit に対して文字列が出力されます。 整数型で用いようとする場合は unit は省略可能で、 その場合には文字列は標準出力に出力されます。 フォーマット文字列 fmt の書式に関しては CPrintfを参照してください。 以下に Printf を用いた出力の例を紹介しておきます。
use gt4f90io use dc_types, only: string use dc_string, only: Printf character(len = string) :: output, color="RED", size="Large" integer, parameter :: n1 = 2, n2 = 3 integer :: int = 10, arrayI1(n1), arrayI2(n2), i real :: arrayR(n1) logical :: eq do, i = 1, n1 arrayI1(i) = 123 * i arrayR(i) = 1.23 * i enddo do, i = 1, n2 arrayI2(i) = 345 * i enddo eq = (maxval(arrayI1) == minval(arrayI2)) ! 装置番号 6 (標準出力) に直接出力する場合 call Printf(unit=6, & & fmt="color=%c size=%c int=%d I1=%*d I2=%*d R=%*r equal=%y", & & c1=trim(color), c2=trim(size), i=(/int, arrayI1, arrayI2/), & & r=(/arrayR/), L=(/eq/), n=(/n1, n2, n1/)) ! 文字列 output に渡す場合 call Printf(unit=output, & & fmt="color=%c size=%c int=%d I1=%*d I2=%*d R=%*r equal=%y", & & c1=trim(color), c2=trim(size), i=(/int, arrayI1, arrayI2/), & & r=(/arrayR/), L=(/eq/), n=(/n1, n2, n1/)) write(*,*) trim(output)