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,]
)
可変長文字列と文字型は相互に代入することができます。 文字型変数に長さの違う可変長文字列を代入する場合には、 長さの違う文字型変数相互間の代入と同様に 右側の切捨てか空白の追加が行われます。
文字型の引数を要求する手続 (関数やサブルーチン) に 可変長文字列を渡す場合は char(可変長文字列) のようにすると文字型の式が得られます。 長さの決まった文字型の式が必要な場合は char(可変長文字列, 長さ) のようにします。
可変長文字列の引数を要求する手続に文字型の値を渡す場合には var_str(文字型の式) のようにすると可変長文字列が得られます。
文字型の式の連結を行う // 演算子は可変長文字列にも利用できます。 可変長文字列を含む連結演算の結果は可変長文字列になります。
文字型の式の大小比較を行う <, <=, ==, >=, >, /= 演算子は可変長文字列にも利用できます。
順番探査で書式付入力として接続されたファイルに対しては、 記録 (UNIX や MS-Windows では行) を単位とした入出力ができます。 入出力対象 string は可変長文字列または文字型のどちらでもかまいません。 GET は記録1つを入力します。 PUT は可変長文字列を出力します。記録を終えませんから、 引き続く PUT の結果は同じ記録にかかれます。 PUT_LINE は記録を終えることを除いて PUT と同等です。
ISO/IEC 1539-2:1994 は可変長文字列を保持するためのインターフェイスを定めています。 本モジュールはこのインターフェイスに従っています。 ただし DISPOSE 手続は ISO 規格には存在しません。
本モジュールには以下の3つの実装があります:
STRING 構造体は文字列値を格納するための CHARACTER 型成分を直接保持しているわけではなく、 ISO_VARYING_STRING モジュール内の文字列表の添字です。 文字列表は文字列値、参照カウンタから構成されています。
参照カウンタは VARYING_STRING 構造体変数への格納数を保持しています。 VARYING_STRING 構造体変数に文字列表の添字を格納する際に、 もともと存在していた番号の参照カウンタが減算されます。 参照カウンタがゼロになると、文字配列のメモリが開放されます。
VARYING_STRING 構造体変数へ格納されることがない (すなわち、関数値として返却されて手続の引数となる) 可変長文字列値の参照カウンタは最初からゼロになっています。 この種の文字配列は十分古くなってから (現在の実装では 64 回以上の文字表生成が経過した後) STRING 構造体変数の整理が行われる際に開放されます。 (この挙動はメモリリークを防ぐために必要です)
したがって、十分複雑な関数呼び出しを評価している途中の 関数の内部で STRING 構造体変数への代入が起こると、 関数の引数であった可変長文字列が開放され、 1文字以上であったはずの文字列が空文字列と誤認される可能性があります。
ISO/IEC 1539-2:1994, Information technology - Programming languages - FORTRAN - Part 2: Varying length character strings.