ISO_VARYING_STRING(3F)

Date: TOYODA Eizi
Source: 2000-02-18

名前

ISO_VARYING_STRING - 可変長文字列モジュール

書式

use iso_varying_string

type(VARYING_STRING):: vstring

! 型変換

type(VARYING_STRING):: vstring, vstring2 character(len = 任意):: chars, chars2 integer:: length

vstring = chars vstring = var_str(chars) chars = string chars = char(vstring, [length])

! このほかの手続や演算子の書式は本文中で示します。

説明

上記書式によって宣言された VARYING_STRING 構造体 (以下では可変長文字列と呼ぶ) は、任意の長さの文字列を保持することができます。

文字型との相互変換

可変長文字列と文字型は相互に代入することができます。 文字型変数に長さの違う可変長文字列を代入する場合には、 長さの違う文字型変数相互間の代入と同様に 右側の切捨てか空白の追加が行われます。

文字型の引数を要求する手続 (関数やサブルーチン) に 可変長文字列を渡す場合は char(可変長文字列) のようにすると文字型の式が得られます。 長さの決まった文字型の式が必要な場合は char(可変長文字列, 長さ) のようにします。

可変長文字列の引数を要求する手続に文字型の値を渡す場合には var_str(文字型の式) のようにすると可変長文字列が得られます。

組み込み演算子の拡張

! 連接演算子
character(len = 適当):: chars, chars2
type(VARYING_STRING):: vstring, vstring2

chars // chars2 ! 組み込み、文字型 chars // vstring2 ! type(VARYING_STRING) 型 vstring // chars2 ! type(VARYING_STRING) 型 vstring // vstring2 ! type(VARYING_STRING) 型

! 比較演算子と比較関数 character(len = 任意) あるいは type(VARYING_STRING):: string_a, string_b

string_a == string_b ! 同値 string_a /= string_b ! 不等 string_a < string_b ! 辞書順で string が前 string_a <= string_b ! 辞書順で string が前か同値 string_a > string_b ! 辞書順で string が後 string_a >= string_b ! 辞書順で string が後か同値 ! ASCII コードでの比較 logical function lge(string_a, string_b) logical function lgt(string_a, string_b) logical function lle(string_a, string_b) logical function llt(string_a, string_b)

文字型の式の連結を行う // 演算子は可変長文字列にも利用できます。 可変長文字列を含む連結演算の結果は可変長文字列になります。

文字型の式の大小比較を行う ==, >=, >, <=, <, /=, .eq., .ge., .gt., .le., .lt. .ne., 演算子 は可変長文字列にも利用できます。 同様に、すべての文字を ASCII 文字集合における符号の大小によって 比較して大小比較を行う lge, lgt, lle, llt 関数も可変長文字列を引数とすることができます。

入出力

character(len = 任意) あるいは
type(VARYING_STRING):: string, set

integer:: unit, maxlen, iostat type(VARYING_STRING):: separator

! get の string, separator 引数とすべての iostat 引数は intent(out) subroutine get([unit,] string, [set=set, [separator=separator,]] & & [maxlen=maxlen,] [iostat=iostat]) subroutine put([unit,] string, [iostat=iostat]) subroutine put_line([unit,] string, [iostat=iostat])

順番探査で書式付入力 (書式付出力) として接続されたファイルに対しては、 記録 (UNIX や MS-Windows では行) を単位とした入出力ができます。 入出力対象 string は可変長文字列または文字型のどちらでもかまいません。 GET は記録1つを入力します。 PUT は可変長文字列を出力します。記録を終えませんから、 引き続く PUT の結果は同じ記録にかかれます。 PUT_LINE は記録を終える (UNIX では改行文字が出力される) ことを除いて PUT と同等です。

文字操作関数

!  substring, set には
!  文字型または type(VARYING_STRING) 型の両方が許容される

logical:: back character(len = 任意) あるいは type(VARYING_STRING):: string, set, substring

integer function index(string, substring) integer function scan(string, set, [back=back]) integer function verify(string, set, [back=back])

integer:: ncopies type(VARYING_STRING):: string

integer function len(string) integer function len_trim(string) integer function ichar(string) integer function iachar(string) type(VARYING_STRING) function adjustl(string) type(VARYING_STRING) function adjustr(string) type(VARYING_STRING) function repeat(string, ncopies)

組み込み関数 INDEX, SCAN, VERYFY は可変長文字列に関する検査を行うことができます。

新設された (同名の組み込み手続がない) 文字列操作手続

logical:: every, back
integer:: start, finish
character(len = 任意) あるいは
 type(VARYING_STRING):: string, set, substring, target
type(VARYING_STRING):: separator, word

type(VARYING_STRING) function insert(string, start, substring) type(VARYING_STRING) function remove(string, start, [finish]) type(VARYING_STRING) function extract(string, start, [finish]) type(VARYING_STRING) function & replace(string, start, [finish,] substring) type(VARYING_STRING) function & replace(string, target, substring, [every=every,] [back=back]) ! word, separator 引数は intent(out) subroutine split(string, word, set, [separator,] [back=back])

TBD.

互換性

ISO/IEC 1539-2:1994 は可変長文字列を保持するためのインターフェイスを定めています。 本モジュールはこのインターフェイスに従っています。

本モジュールには以下の3つの実装があります:

string_p.f90
ポインタ版。ポインタで任意の長さの文字バッファを割り付けます。
string.f90
バッファ版。ポインタを使いませんが 508 文字までの文字列しか扱えません。
string_psr.f90
PSR vf90 用その場しのぎ版。

バグ

ポインタ版

STRING 構造体は文字列値を格納するための CHARACTER 型成分を直接保持しているわけではなく、 ISO_VARYING_STRING モジュール内の文字列表の添字を成分として持ちます。 文字列表は文字列値、参照カウンタから構成されています。

参照カウンタは VARYING_STRING 構造体変数への格納数を保持しています。 VARYING_STRING 構造体変数に文字列表の添字を格納する際に、 もともと構造体が保持していた番号の参照カウンタが減算されます。 参照カウンタがゼロになると、文字配列のメモリが解放されます。

VARYING_STRING 構造体変数へ格納されることがない (すなわち、関数値として返却されて手続の引数となる) 可変長文字列値の参照カウンタは最初からゼロになっています。 この種の文字配列は最初の参照後十分古くなってから (現在の実装では 64 回以上の文字表生成が経過した後) STRING 構造体変数の整理が行われる際に解放されます。 したがって、十分複雑にネストした関数呼び出しを評価すると 関数の引数であった可変長文字列が解放されて空文字列と誤認される 可能性があります。 (この挙動はメモリリークを防ぐためのものですが、 問題が多いので廃止されるかもしれません)

以下の注意に従うとメモリリーク及び文字列の消失が極小化されます。 VARYING_STRING 構造体を返す関数を別の手続の引数として 利用しないで、いったん VARYING_STRING 型変数に格納してから 手続を呼び出してください。 VARYING_STRING 構造体変数を用いる手続を終了する前に空文字列 '' を 代入してください。 VARYING_STRING 構造体変数を含んだ構造体には 利用者定義代入を定義し、組み込み代入を行わせないでください。

バッファ版

508 バイトを超える長さの文字列を取り扱うことはできません。

PSR 版

508 バイトを超える長さの文字列を取り扱うことはできません。 CHAR などの文字型を返す関数値の長さは 508 に固定されています。 このため内部で CHAR 関数を呼び出して実装されている手続はほとんど正常な結果をもたらしません。 GET サブルーチンは停留入力を行いません。 これはすべて PSR VAST/F90 コンパイラが Fortran 90 規格に 従わないためにやむなく導入された制限です。

参照

ISO/IEC 1539-2:1994, Information technology - Programming languages - FORTRAN - Part 2: Varying length character strings.


HTML generated using htroff at 30 May 2000 10:16:44.