ISO_VARYING_STRING(3F)

Date: TOYODA Eizi
Source: 2000-02-18

名前

ISO_VARYING_STRING - 可変長文字列ライブラリ

書式

USE ISO_VARYING_STRING
TYPE(VARYING_STRING):: variable

CALL GET( [unit,] string, [MAXLEN= integralvalue,] [IOSTAT= integralvariable,] )
CALL PUT( [unit,] string, [IOSTAT= integralvariable,] )
CALL PUT_LINE( [unit,] string, [IOSTAT= integralvariable,] )

説明

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

文字型との相互変換

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

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

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

組み込み演算子の拡張

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

文字型の式の大小比較を行う <, <=, ==, >=, >, /= 演算子は可変長文字列にも利用できます。

入出力

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

文字操作関数

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

互換性

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

本モジュールには以下の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 1 March 2000 22:37:11.