Fortran 90 では、名前リスト形式は、順次アクセスでのみ使用できます。
+----------------------------------IBM 拡張----------------------------------+
XL Fortran では、名前リストの形式設定を内部ファイルおよびストリーム・アクセスで使用することもできます。
+--------------------------------IBM 拡張の終り-------------------------------+
名前リスト入力の入力形式は次のとおりです。
区切られた文字定数を継続する入力レコードの先頭のブランクは、定数の一部と見なされます。
+----------------------------------IBM 拡張----------------------------------+
NAMELIST 実行時オプションが OLD の場合、 NAMELIST ステートメントに対する入力は、次のものからなります。
+--------------------------------IBM 拡張の終り-------------------------------+
+---------------------------------Fortran 95---------------------------------+
Fortran 95 では、名前リスト内で注釈を使うことができます。
NAMELIST 実行時オプションに NEW または OLD のどちらの値が指定されているかに応じて、異なる規則が適用されます。
値 NEW が NAMELIST 実行時オプションに指定されている場合は、名前リストの注釈には以下の規則が適用されます。
+------------------------------Fortran 95 の終り------------------------------+
+----------------------------------IBM 拡張----------------------------------+
値 OLD が NAMELIST 実行時オプションに指定されている場合は、名前リストの注釈には以下の規則が適用されます。
+--------------------------------IBM 拡張の終り-------------------------------+
名前リストの注釈はストリーム入力では使用できません。
入力レコード内の名前値サブシーケンスの形式は次のとおりです。
>>-name-- = --constant_list------------------------------------>< |
>>-+----+--literal_constant------------------------------------>< '-r*-' |
name を修飾するために使用した添え字、ストライド、およびサブストリングの範囲式はすべて、kind タイプ・パラメーターが指定されていない整数リテラル定数となります。
文字以外の入力データ型に関する内容については、 リスト指示入力を参照してください。
name が配列でものオブジェクトでもない場合、 constant_list には単一の定数しか入れられません。
入力ファイルに指定されている変数名を、名前リストに指定しなければなりませんが、入力データの順序は自由です。 name と等しくなるように設定した名前で、名前リスト内の名前を代替することはできません。名前リストに指定できるものの詳細については、 NAMELISTを参照してください。
各名前値サブシーケンスにおいて、名前はオプションの修飾子付きの名前リスト・グループ項目の名前でなければなりません。オプションの修飾子付きの名前は、ゼロ・サイズ配列、ゼロ・サイズ配列セクション、またはゼロ長の文字ストリングになることはできません。オプションである修飾子が指定された場合には、ベクトル添え字を入れることはできません。
name がベクトル添え字なしの配列または配列セクションの場合は、格納された順に、配列の全エレメントのリストに展開されます。 name が構造体の場合、定義で指定された順序にしたがって、組み込みタイプの最終コンポーネントのリストに展開されます。派生型の最終コンポーネントは、ポインターまたは割り当て可能なものであってはなりません。
name が配列または構造体の場合、constant_list 内の定数の数は、name の拡張で指定した項目数以下になります。定数の数が項目数を下回る場合は、残りの項目は前の値を保持します。
ヌル値は、次のように指定します。
ヌル値は、対応する入力リスト項目の定義状況に影響を与えません。名前リスト・グループ・オブジェクト・リスト項目が定義されると、前の値を保持します。定義されない場合は、未定義状態のままになります。ヌル値を複素数の実数部または虚数部として使用することはできませんが、単一のヌル値は、複素定数全体を表すことができます。
値のセパレーターの後に続くレコードの終わりは、ブランクが途中に入るか否かにかかわらず、ヌル値を指定しません。
+----------------------------------IBM 拡張----------------------------------+
LANGLVL 実行時オプションが EXTENDED に設定されると、XL Fortran によって複数の入力値を単一の配列エレメントとともに指定することができます。配列エレメントで、サブオブジェクトの指定子を指定することはできません。これが行われると、値は配列エレメントの順に、配列の連続するエレメントに割り当てられます。たとえば、配列 A が次のように宣言されたと想定します。
INTEGER A(100) NAMELIST /FOO/ A READ (5, FOO)
続いて、次の入力が装置 5 に指定されます。
&FOO A(3) = 2, 10, 15, 16 /READ ステートメントの実行時に、A(3) に値 2、A(4) に値 10、 A(5) に値 15、A(6) に値 16 がそれぞれ割り当てられます。
複数の値を単一の配列エレメントとともに指定する場合は、論理定数の前にピリオドを付けて指定しなければなりません (例: .T)。
NAMELIST 実行時オプションが値 OLD を用いて指定されている場合、BLANK= 指定子は、非文字定数の間にある埋め込まれたブランクおよび後書きブランクをどのように扱うかを指定します。
-qmixed コンパイラー・オプションを指定すると、名前リスト・グループ名およびリスト項目名で、大文字小文字の区別が行われます。
+--------------------------------IBM 拡張の終り-------------------------------+
名前リスト入力ステートメントの実行時に値のセパレーターとしてスラッシュが検出されると、以前の値の割り当てが行われた後にその入力ステートメントの実行が終了されます。転送中の名前リスト・グループ・オブジェクト内に追加項目がある場合、ヌル値が入れられたのと同様の効力を持ちます。
READ ステートメントが実行される前には、ファイル NMLEXP には次のデータが入っています。
文字位置:
1 2 3 1...+....0....+....0....+....0
ファイルの内容:
&NAME1 I=5, SMITH%P_AGE=40 /
上記のファイルには、4 つのデータ・レコードが入っています。プログラムには、次のデータが入っています。
TYPE PERSON INTEGER P_AGE CHARACTER(20) P_NAME END TYPE PERSON TYPE(PERSON) SMITH NAMELIST /NAME1/ I,J,K,SMITH I=1 J=2 K=3 SMITH=PERSON(20,'John Smith') OPEN(7,FILE='NMLEXP') READ(7,NML=NAME1) ! Only the value of I and P_AGE in SMITH are ! altered (I = 5, SMITH%P_AGE = 40). ! J, K and P_NAME in SMITH remain the same. END
文字位置:
1 2 3 4 1...+....0....+....0....+....0....+....0
ファイルの内容:
&NAME1 I= 5, SMITH%P_AGE=40 /
+---------------------------------Fortran 95---------------------------------+
NAMELIST=NEW の指定時に、値のセパレーターのスペースの後ろに NAMELIST の注釈が置かれるときの NAMELIST の注釈の例を示します。
&TODAY I=12345 ! This is a comment. / X(1)=12345, X(3:4)=2*1.5, I=6, P="!ISN'T_BOB'S", Z=(123,0)/
+------------------------------Fortran 95 の終り------------------------------+
+----------------------------------IBM 拡張----------------------------------+
NAMELIST=OLD の指定時に、値のセパレーターに続くスペースに NAMELIST の注釈が置かれるときの NAMELIST 注釈の例を示します。
&TODAY I=12345, ! This is a comment. X(1)=12345, X(3:4)=2*1.5, I=6, P="!ISN'T_BOB'S", Z=(123,0) &END
+--------------------------------IBM 拡張の終り-------------------------------+
名前リストを使って出力データを書き込むと、名前リストを使って読み取り可能な形式で書き込まれます (ただし、区切られていない文字データを除きます)。名前リストに指定したすべての変数名およびそれらの値が、それぞれのタイプに従って書き込まれます。文字データは DELIM= 指定子で指定したように区切られます。データを入れるためのフィールドには、すべての有効数字を収容するために十分な大きさがとられます (フィールドの内容については、 表 13 を参照してください)。完全な配列の値は、列順で書き込まれます。
+----------------------------------IBM 拡張----------------------------------+
名前リストを指定している WRITE ステートメントは、名前リスト名を含む単一のレコード、そのレコードに続く、出力データ項目を含む 1 つ以上のレコード、およびスラッシュ (/) 終了マーカーを含む最終レコードの 3 つ以上の出力レコードを作成します。名前リスト出力を受け取るための内部ファイルは、少なくとも 3 つのエレメントを含む文字配列となります。 WRITE ステートメント内の転送データの量によって、4 つ以上の配列エレメントが必要となる場合があります。文字変数がデータをすべて保持できる長さであっても、その長い文字変数 1 つだけを使用することはできません。配列エレメントの長さがデータを保持するのに十分でない場合は、4 つ以上の配列エレメントを指定する必要があります。
+--------------------------------IBM 拡張の終り-------------------------------+
NAMELIST 実行時オプションが指定されないか、NAMELIST=NEW である場合、名前リスト・グループ名および名前リスト項目名は大文字で出力されます。
+----------------------------------IBM 拡張----------------------------------+
NAMELIST=OLD を指定すると、名前リスト・グループ名および名前リスト項目名が小文字で出力されます。 -qmixed コンパイラー・オプションが指定されると、 NAMELIST 実行時オプションの値に関係なく、名前で大文字小文字の区別がなされます。
NAMELIST=OLD を指定すると、出力レコードの終わりが &end によって示されます。
値 OLD を指定し、DELIM= を指定しないで NAMELIST 実行時オプションを指定すると、文字データがアポストロフィで区切られます。区切られていない文字ストリングは、アポストロフィで区切られ、コンマによって分離されます。また、前のレコードから継続している文字ストリングで始まるレコードの先頭にブランクは入れられません。
+--------------------------------IBM 拡張の終り-------------------------------+
DELIM= 指定子なしか、または NONE の値を持つ DELIM= を指定してオープンしたファイル用に出力される文字定数は、次のようになります。
書き込まれた、区切りのない文字データは、文字データとして読み取ることはできません。
+----------------------------------IBM 拡張----------------------------------+
内部ファイルの場合、文字定数は、DELIM= 指定子に、値 APOSTROPHE を指定して書き込みます。
+--------------------------------IBM 拡張の終り-------------------------------+
値 QUOTE の DELIM= 指定子付きでオープンしたファイル用に出力された文字定数は、二重引用符によって区切られ、値のセパレーターが前後に入り、2 つの連続する二重引用符によって外部メディア上に表される内部引用符を持ちます。
値 APOSTROPHE の DELIM= 指定子付きでオープンされたファイル用に出力された文字定数は、アポストロフィによって区切られ、値のセパレーターが前後に入り、2 つの連続するアポストロフィによって外部メディア上に表される内部アポストロフィを持ちます。
+----------------------------------IBM 拡張----------------------------------+
出力レコードを指定の幅に抑えるには、OPEN ステートメント内で RECL= 指定子を指定するか、あるいは NLWIDTH 実行時オプションを指定します。 NLWIDTH 実行時オプションについては、「ユーザーズ・ガイド」を参照してください。
+--------------------------------IBM 拡張の終り-------------------------------+
区切られた文字定数が継続する場合を除いて、各出力レコードは、レコードを印刷するときに紙送り制御を行うために、ブランク文字で始まります。
+----------------------------------IBM 拡張----------------------------------+
外部ファイルの場合は、デフォルトの設定で、出力項目すべてを含むのに十分な大きさの単一の出力レコードにすべての出力項目を指定できます。レコードを別の行に出力するには、(OPEN ステートメント内で) RECL= 指定子を使用するか、または NLWIDTH 実行時オプションを使用します。
+--------------------------------IBM 拡張の終り-------------------------------+
非文字の出力データのタイプについては、 リスト指示出力 を参照してください。
TYPE PERSON INTEGER P_AGE CHARACTER(20) P_NAME END TYPE PERSON TYPE(PERSON) SMITH NAMELIST /NL1/ I,J,C,SMITH CHARACTER(5) :: C='BACON' INTEGER I,J I=12046 J=12047 SMITH=PERSON(20,'John Smith') WRITE(6,NL1) END
NAMELIST=NEW の WRITE ステートメントの実行後の出力データ:
1 2 3 4 1...+....0....+....0....+....0....+....0 &NL1 I=12046, J=12047, C=BACON, SMITH=20, John Smith /
+----------------------------------IBM 拡張----------------------------------+
NAMELIST=OLD の WRITE ステートメントの実行後の出力データ:
1 2 3 4 1...+....0....+....0....+....0....+....0 &nl1 i=12046, j=12047, c='BACON', smith=20, 'John Smith ' &end
+--------------------------------IBM 拡張の終り-------------------------------+