変数群順番 READ 文は,対応する NAMELIST 文中のオブジェクトのデータ型を使ってデータ形式を決定することにより,データを外部形式から内部形式に変換します。変換されたデータは,変数群名中の指定されたオブジェクトにそれらのオブジェクトが現れた順に左から右に代入されます。
実行中に斜線 (/) が現れると,READ 文は終了し,残りの入力並び項目は変更されないままになります。
ファイルが書式なし I/O のために接続されている場合,変数群データ転送は禁止されます。
変数群外部記録は次の形式を取ります。
&group-name object = value [, object = value] .../
group-name
値を与えるオブジェクトを含んでいる変数群要素名。名前は,その有効域中で,事前に NAMELIST 文中で定義されていなくてはなりません。名前は埋め込み空白を含んでいてはならず,1 つの記録内に含まれている必要があります。
object
変数群要素名の NAMELIST 宣言中で定義されている要素名 (または部分オブジェクト特定子)。オブジェクト名は,添字または部分列指定子の括弧中を除いて,埋め込み空白を含んでいてはなりません。個々のオブジェクトは 1 つの記録内に含まれている必要があります。
value
以下のいずれかです。
個々の定数は,整数型,実数型,複素数型,論理型,または文字型の定数表現であるか,区切り文字のない文字列でなくてはなりません。2 進,8 進,16 進,ホレリス,および名前付き定数は使用できません。
一般に,定数の形式は並び項目の型に対して有効なものでなくてはなりません。定数のデータ型は,値のデータ型と,外部形式から内部形式への変換を決定します。また,以下の規則も適用されます。
数値並び項目は数値定数にしか対応できず,文字並び項目は文字定数にしか対応できません。数値並び要素とその対応する数値定数のデータ型が一致しなければ,算術代入の規則に従って変換が行われます (「数値代入文」の「数値代入文の変換規則」を参照)。
複素数定数は,実数または整数の定数の組をコンマで区切り,括弧で囲んだ形式を持ちます。左括弧と最初の定数,区切りのコンマの前後,および第 2 定数と右括弧の間には空白を置くことができます。
論理定数は,真の値 (.TRUE.,または T,.T,t,.t で始まる任意の値) か偽の値 (.FALSE.,または F,.F,f,.f で始まる任意の値) を表します。
文字列は,対応する NAMELIST 項目が基本文字型であり,以下の条件が真であれば,アポストロフィまたは引用符で区切られる必要はありません。
文字列に空白,コンマ (,),斜線 (,),アンド記号 (&),ドル記号 ($),左閉じ括弧,等号 (=),パーセント記号 (%),およびピリオド (.) が含まれていない。
文字列が記録境界を越えて継続していない。
文字列中の最初の非空白文字がアポストロフィや引用符ではない。
先頭の文字がアスタリスクの前の数字ではない。
区切られていない文字列は,最初に現れる空白,コンマ,斜線,記録終了,感嘆符,アンド記号,またはドル記号で終了されます。区切られていない文字列中のアポストロフィと引用符は,そのまま転送されます。
等号,パーセント記号,またはピリオドが,区切られていない文字列を走査している時に発見された場合,文字列は変数名 (または変数名の一部) として取り扱われ,区切られていない文字列としては取り扱われません。
ヌル値は,2 つの連続した値区切り子 (,, など),または空白以外の初期値区切り子によって指定されます (記録終了の前にある値区切り子は,ヌル値を表しません)。
ヌル値は,対応する並び要素が変更されないまま残されることを示します。ヌル値は複素数定数全体を表すことができますが,複素数定数の実部または虚部だけのために使用することはできません。
ヌル値の繰り返し (r*),または定数の繰り返し (r*constant)。r は,種別パラメタを持たず,空白が埋め込まれていない符号なしのゼロでない整定数表現です。
空白は,先頭のアンド記号 (&) の前後,変数群名の後,等号の前後,または末尾の斜線の前に置くことができます。
注釈 (! のみで始まります) は,変数群入力のどの位置にも置くことができます。注釈はソース行の終わりまで続きます。
変数群データ転送のための入力記録中に,同じ要素が複数回現れた場合,最後の値が使用されます。
object = value の組が複数存在する場合,それらは値区切り子で区切られている必要があります。
値区切り子は,任意の数の空白,または任意の数の空白の前後に付けられた 1 つのコンマあるいは斜線です。このような値区切り子が文字定数中に現れた場合,値区切り子ではなく定数の一部と見なされます。
記録終了は空白文字と等価です (文字定数中にある場合を除く)。文字定数中に記録終了がある場合,その記録終了は無視され,文字定数は次の記録に継続されます (前の記録の最後の文字の直後に,次の記録の最初の文字が続けられます)。
記録の先頭にある空白は,前の記録から継続された文字定数の一部である場合を除いて無視されます。記録の先頭にある空白が前の記録から継続された文字定数の一部である場合,記録の先頭の空白は定数の一部と見なされます。
変数群 READ 文を含んでいるプログラムの実行中に,疑問符 (?) または等号と疑問符を続けたもの (=?) を指定すると,変数群要素に関する情報を得ることができます。? または =? の前には 1 つまたは複数の空白がなくてはなりません。
入力と出力の両方が可能な装置に対して ? を指定した場合,変数群要素名と,その変数群要素中のオブジェクトが表示されます。=? を指定した場合,変数群要素名,その変数群要素中のオブジェクト,およびそれらのオブジェクトの現在値が (変数群出力書式で) 表示されます。別の形式の装置に対して指定された場合,これらのシンボルは無視されます。
たとえば,以下の文を考えます。
NAMELIST /NLIST/ A,B,C REAL A /1.5/ INTEGER B /2/ CHARACTER*5 C /'ABCDE'/ READ (5,NML=NLIST) WRITE (6,NML=NLIST) END
実行中に,ターミナル装置で空白の後に ? を入力すると,以下の値が表示されます。
&NLIST A B C /
空白の後に =? を入力すると,以下の値が表示されます。
&NLIST A = 1.500000 , B = 2, C = ABCDE /
例
以下の文が指定されているとします。
NAMELIST /CONTROL/ TITLE, RESET, START, STOP, INTERVAL CHARACTER*10 TITLE REAL(KIND=8) START, STOP LOGICAL(KIND=4) RESET INTEGER(KIND=4) INTERVAL READ (UNIT=1, NML=CONTROL)
NAMELIST 文は,変数群要素名 CONTROL に 5 つのオブジェクトの並びを結合します。対応する READ 文は,装置 1 から以下の入力データを読み取ります。
&CONTROL TITLE='TESTT002AA', INTERVAL=1, RESET=.TRUE., START=10.2, STOP =14.5 /
変数群要素 CONTROL 中のオブジェクトには,以下の値が代入されます。
変数群オブジェクト | 代入される値 |
TITLE | TESTT002AA |
RESET | T |
START | 10.2 |
STOP | 14.5 |
INTERVAL | 1 |
対応する NAMELIST 変数群要素中で宣言されているすべてのオブジェクトに値を代入する必要はありません。特定の変数群オブジェクトが入力文中になければ,その値は変更されません (値が存在する場合)。
同じように,部分列と配列要素が指定された場合,指定された変数部分列と配列要素だけが変更されます。たとえば,次の入力が読み取られたとします。
&CONTROL TITLE(9:10)='BB' /
TITLE の新しい値は TESTT002BB です。変更されるのは,変数中の最後の 2 文字だけです。
次の例は,オブジェクトとしての配列を示しています。
DIMENSION ARRAY_A(20) NAMELIST /ELEM/ ARRAY_A READ (UNIT=1,NML=ELEM)
次の入力が読み取られたとします。
&ELEM ARRAY_A=1.1, 1.2, , 1.4 /
ARRAY_A の要素には,以下の値が代入されます。
配列要素 | 代入される値 |
ARRAY_A(1) | 1.1 |
ARRAY_A(2) | 1.2 |
ARRAY_A(3) | 変更されない |
ARRAY_A(4) | 1.4 |
ARRAY_A(5)...ARRAY(20) | 変更されない |
配列要素に値並びが代入された場合,代入は配列の最初の要素ではなく,指定された配列要素から開始されます。たとえば,次の入力が読み取られたとします。
&ELEM ARRAY_A(3)=34.54, 45.34, 87.63, 3*20.00 /
新しい値は,配列 ARRAY_A の要素 3 ~ 8 だけに代入されます。他の要素値は変更されません。
以下に他の例を示します。
INTEGER a, b NAMELIST /mynml/ a, b ... ! 以下は,すべて有効な変数群変数代入です。 &mynml a = 1 / $mynml a = 1 $ $mynml a = 1 $end &mynml a = 1 & &mynml a = 1 $END &mynml a = 1 b = 2 /
NAMELIST を使って書き出される区切られていない文字列は,対応する NAMELIST 読み込みで期待されるようには読み込めません。以下の例を考えます。
NAMELIST/TEST/ CHARR CHARACTER*3 CHARR(4) DATA CHARR/'AAA', 'BBB', 'CCC', 'DDD'/ OPEN (UNIT=1, FILE='NMLTEST.DAT') WRITE (1, NML=TEST) END
出力ファイル NMLTEST.DAT には,以下の内容が書き込まれます。
&TEST CHARR = AAABBBCCCDDD /
以下のように区切られていない文字列を使った NAMELIST 読み取りで NMLTEST.DAT 中のデータを読み込みます。
NAMELIST/TEST/ CHARR CHARACTER*3 CHARR(4) DATA CHARR/4*' '/ OPEN (UNIT=1, FILE='NMLTEST.DAT') READ (1, NML=TEST) PRINT *, 'CHARR read in >', CHARR(1),'< >',CHARR(2),'< >', & CHARR(3), '< >', CHARR(4), '<' END
結果は以下のようになります。
CHARR read in >AAA< > < > < > <
関連情報
NAMELIST 文については,「NAMELIST」を参照してください。
書式付き順番 READ 文に関する一般的な規則については,「書式付き順番 READ 文の規則」を参照してください。
変数群外部記録の代替形式については,「変数群外部記録の代替形式」を参照してください。
変数群出力については,「変数群順番 WRITE 文の規則」を参照してください。