変数群順番 READ 文の規則

変数群順番 READ 文は,対応する NAMELIST 文中のオブジェクトのデータ型を使ってデータ形式を決定することにより,データを外部形式から内部形式に変換します。変換されたデータは,変数群名中の指定されたオブジェクトにそれらのオブジェクトが現れた順に左から右に代入されます。

実行中に斜線 (/) が現れると,READ 文は終了し,残りの入力並び項目は変更されないままになります。

ファイルが書式なし I/O のために接続されている場合,変数群データ転送は禁止されます。

変数群記録

変数群外部記録は次の形式を取ります。

&group-name object = value [, object = value] .../

group-name
値を与えるオブジェクトを含んでいる変数群要素名。名前は,その有効域中で,事前に NAMELIST 文中で定義されていなくてはなりません。名前は埋め込み空白を含んでいてはならず,1 つの記録内に含まれている必要があります。

object
変数群要素名の NAMELIST 宣言中で定義されている要素名 (または部分オブジェクト特定子)。オブジェクト名は,添字または部分列指定子の括弧中を除いて,埋め込み空白を含んでいてはなりません。個々のオブジェクトは 1 つの記録内に含まれている必要があります。

value
以下のいずれかです。

空白は,先頭のアンド記号 (&) の前後,変数群名の後,等号の前後,または末尾の斜線の前に置くことができます。

注釈 (! のみで始まります) は,変数群入力のどの位置にも置くことができます。注釈はソース行の終わりまで続きます。

変数群データ転送のための入力記録中に,同じ要素が複数回現れた場合,最後の値が使用されます。

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<  >   <  >   <  >   <

関連情報