9.8 その他のFortran 2003の機能
9.8.1 抽象引用仕様とPROCEDURE文 [5.1]
抽象引用仕様が手続き宣言文と共に追加されました。 抽象引用仕様は引用仕様ブロックで定義されABSTRACTキーワードを持ちます。ABSTRACT INTERFACE抽象引用仕様ブロック内のそれぞれの引用仕様本体は手続きの宣言を行う代りに抽象 引用仕様を定義します。 抽象引用仕様の名前は手続き宣言文で使用し、該当引用仕様を持つ個別手続きを宣言 できます。
例:
PROCEDURE(aname) :: spec1, spec2これはSPEC1とSPEC2を、抽象引用仕様ANAMEで定義される引用 仕様(すなわち型、引数、等)を持つ手続きとして宣言します。
手続き宣言文は明示的な引用仕様を持つ任意の手続き名と一緒に使用することもでき
ます。
例:
PROCEDURE(x) yこれはYがXと同じ引用仕様を持つことを宣言します。 また、暗黙的な引用仕様を持つ手続きの宣言を名前の代りに型指定を持つ PROCEDUREを指定して、もしくは名前を完全に省略して行うことができます。
次の属性は手続き宣言文上で同時に宣言可能です:BIND(C...),
INTENT(intent), OPTIONAL, POINTER,
PRIVATE, PUBLIC, SAVE。
例:
PROCEDURE(aname),PRIVATE :: spec3
POINTERは手続きポインタ(次セクション参照)を宣言し、INTENTと SAVEは手続きポインタに対して許され、通常の手続きでは許されない点に注 意して下さい。 nAG Fortranコンパイラは手続き宣言文でPROTECTED属性を指定することも許 容します。これは公開されているFortran 2003標準に対する拡張です。
9.8.2 名前付き手続きポインタ [5.2]
手続きポインタはPOINTER属性を持つ手続きで、名前付きポインタもしくは 構造体成分(他で説明されています)であり得ます。 手続きポインタを宣言する通常の方法は、手続き宣言文にPOINTER節を含め る方法です。例:
PROCEDURE(aname),POINTER :: p => NULL()これはPが引用仕様ANAMEを持つ手続きポインタとして宣言し、それを 遊離状態ポインタとして初期化します。
名前付き手続きポインタは通常の手続き宣言の他にPOINTER属性を指定して宣言 することもできます。例えば型宣言文により宣言された関数は、型宣言中に POINTER属性が含まれている場合には関数ポインタになります。
REAL, EXTERNAL, POINTER :: funptrPOINTER文も引用仕様ブロック、EXTERNAL文、もしくは型宣言文と併用すること により、手続きポインタを宣言するのに使用することができます。
例:
INTERFACE SUBROUTINE sub(a,b) REAL,INTENT(INOUT) :: a,b END SUBROUTINE END INTERFACE POINTER sub
手続きポインタを手続きポインタ成分として構造型中に格納することもできます。 構文と動作は若干異なり、“オブジェクト結束手続き”のように振る舞います。 オブジェクト指向プログラミングセクションをご参照ください。
9.8.3 組込みモジュール [4.x]
Fortran 2003標準はモジュールを組込みと非組込みに分類します。 非組込みモジュールは通常の(ユーザ定義の)モジュールです。一方、組込み モジュールはFortranコンパイラの組込み部分として提供されるものです。Fortran 2003には5つの標準モジュールがあります:IEEE_ARITHMETIC, IEEE_EXCEPTIONS, IEEE_FEATURES, ISO_C_BINDING and ISO_FORTRAN_ENV。
プログラムは組込みモジュールと同じ名前の非組込みモジュールを持つことができ
ます。そのためにUSE文が拡張されました。
‘USE,INTRINSIC ::’は組込みモジュールが必要であることを示し、
‘USE,NON_INTRINSIC ::’は非組込みモジュールが必要であることを
示します。
これらが使用されなかった場合、コンパイラはユーザ定義モジュールが見つからな
かったときにのみ組込みモジュールを選択します。
例:
USE,INTRINSIC :: iso_fortran_envこれは標準組込みモジュールISO_FORTRAN_ENVを使いますが、
USE,NON_INTRINSIC :: iso_fortran_envは該当名を持つユーザ定義モジュールを使用します。 いずれかの指定子を使用する場合には2つのコロン‘::’が必要 である点に注意して下さい。
9.8.4 USE文でのユーザ定義演算子の仮称指定 [5.2]
名前付き要素の仮称指定ができるのと同様に、USE文でユーザ定義演算子の仮称指定 が行えるようになりました。例:
USE my_module, OPERATOR(.localid.)=>OPERATOR(.remotename.)これはMY_MODULEからすべてをインポートしつつ、.REMOTENAME.演算 子の仮称を.LOCALID.とします。
この機能はユーザ定義演算子名に対してのみ利用可能である点に注意して下さい。 組込み演算子.AND.等やASSIGNMENT(=)に対してはこのような仮称指定 を行えません。 リモート側(モジュール要素)が演算子の場合にはローカル側の名前は演算子でなく てはなりません。すなわち、
USE my_module, something=>OPERATOR(.anything.) USE my_module, OPERATOR(.something.)=>anythingは共に不正です(構文エラーとなります)。
9.8.5 ISO_FORTRAN_ENVモジュール [5.1]
標準組込みモジュールISO_FORTRAN_ENVが新たに利用可能となりました。 これには以下のデフォルトINTEGER名前付き定数が含まれています。- CHARACTER_STORAGE_SIZE
- ビット単位での文字記憶単位の大きさ
- ERROR_UNIT
- エラー出力(“stderr”)用の論理装置番号
- FILE_STORAGE_SIZE
- RECL=で利用されるビット単位でのファイル記憶単位の大きさ
- INPUT_UNIT
- READのデフォルト(‘*’)装置番号
- IOSTAT_END
- ファイル終端に対するIOSTAT=戻り値
- IOSTAT_EOR
- レコード終端に対するIOSTAT=戻り値
- NUMERIC_STORAGE_SIZE
- ビット単位での数値記憶単位の大きさ
- OUTPUT_UNIT
- PRINTで使われる装置、WRITEの‘*’装置と同じ
9.8.6 IMPORT文 [5.1]
IMPORT文が追加されました。 次の構文を持ちます。IMPORT [ [ :: ] name [ , name ]... ]
引用仕様本体でのみ使用でき、そこに親の有効域から名前付き要素がインポートされ ます(通常であればこれらの要素は引用仕様本体から参照できません)。 名前の指定が行われなかった場合には、この引用仕様本体に対し通常の親子結合規則 が有効となります。IMPORT文はUSE文の後で、その他のすべての宣言(特に IMPLICIT文とPARAMETER文)に先行する位置に置かれなくては なりません。 IMPORTでインポートされるものはすべて引用仕様本体より手前で宣言 されていなくてはなりません。
9.8.7 名前と文の長さ
名前は最大(31文字ではなく)63文字まで許されます([4.x])。 そして文は最大(39ではなく)255の継続行を持つことが許されます([5.2])。9.8.8 配列構成子構文の機能強化
配列構成子において、かぎ括弧([ ])が括弧とスラッシュの組み合わせ ((/ /))の代りに使用できるようになりました([5.1])。 配列構成子が通常の括弧と共に使われる場合に、式がより読みやすいものとなり ます。RESHAPE((/(i/2.0,i=1,100)/),(/2,3/)) ! Old way RESHAPE([(i/2.0,i=1,100)],[2,3]) ! New way
配列構成子を型指定とそれに引き続く2つのコロン(::)で始めることが できるようになりました([5.2])。 これにより大きさゼロの構成子が簡単になり(更に文字長に関する曖昧さがなくな り)、代入変換機能もサポートされるため、すべての文字列にパディングを施して 同一長とする必要がなくなりました。
[ Logical :: ] ! Zero-sized logical array [ Double Precision :: 17.5, 0, 0.1d0 ] ! Conversions [ Character(200) :: 'Alf', 'Bernadette' ] ! Padded to length 200
9.8.9 構造体構成子構文の機能強化 [5.3]
Fortran 2003では構造体構成子に対する3つの機能強化があります:- 仮引数名が引数キーワードとして利用できるのと同じように、成分名がキーワードと して使用できます。
- デフォルトの初期化を持つ成分に対しては値を省略できます。
- 型名が総称関数名と同じでも良く、参照は(構文が関数の引数並びと一致すれば) 適切な関数を選択することにより、また実引数と一致する関数がなかった場合にのみ 構造体構造子として扱うことにより解決されます。
四つ目の機能強化はFortran 2008に含まれるものです。(割付可能な要素の値を省略することが可能です)
これにより構造体構成子は必要に応じてオーバーライド可能な組込み型総称関数 のようになります。 これらの機能強化の例を次に示します。
TYPE quaternion REAL x=0,ix=0,jx=0,kx=0 END TYPE ... INTERFACE quaternion MODULE PROCEDURE quat_from_complex END INTERFACE ... TYPE(quaternion) FUNCTION quat_from_complex(c) RESULT(r) COMPLEX c r%x = REAL(c) r%y = AIMAG(c) r%z = 0 r%a = 0 END FUNCTION ... COMPLEX c TYPE(quaternion) q q = quaternion(3.14159265) ! Structure constructor, value (~pi,0,0,0). q = quaternion(jx=1) ! Structure constructor, value (0,0,1,0). q = quaternion(c) ! "Constructor" function quat_from_complex.
また型が拡張型の場合、祖先要素名を使って全ての継承された要素の値を一回で与える事ができます。
この拡張により、型がプライベート要素を持っていても下記の条件にあてはまる場合には構造体構成子を使う事ができます。
- 要素が割付可能な場合(解放されます)
- 要素が暗黙的初期値指定される場合(デフォルト値を持ちます)
- 要素が継承されている場合で祖先要素を使って値を与え、且つ他の要素が祖先より継承される場合
9.8.10 無指定文字長 [5.2]
文字ポインタもしくは割付け変数の長さを無指定(長さをコロン:と指定)と宣言する ことが可能になりました。例:
CHARACTER(LEN=:),POINTER :: ch無指定ポインタ(もしくは割付け変数)の長さは割付け時(次のセクション参照)もし くはポインタ結合時に決定されます。
例:
CHARACTER,TARGET :: t1*3,t2*27 CHARACTER(:),POINTER :: p p => t1 PRINT *,LEN(p) p => t2 PRINT *,LEN(p)この例では最初に3が出力され、次に27が出力されます。 長さが無指定の遊離状態ポインタに対しLENを調べることは許されていません。
無指定長は特に型付き割付け、元指定割付け、スカラ割付け、自動再割付けなどの新 機能と併用したときに特に有用です。
9.8.11 ERRMSG=指定子 [5.1]
ALLOCATE文とDEALLOCATE文において新たにERRMSG=指定子が 使えるようになりました。 この指定子はスカラデフォルト文字変数を取り、それには割付けもしくは解放エラ ーが生じたときに説明メッセージが代入されることになります。 エラーが発生しなかった場合には、変数の値はそのまま変化しません。 この機能はSTAT=指定子の方も使われなければ(プログラムは異常終了させ られてしまうので)意味をなさない事に注意して下さい。例:
ALLOCATE(w(n),STAT=ierror,ERRMSG=message) IF (ierror/=0) THEN PRINT *,'Error allocating W: ',TRIM(message) RETURN END IF
9.8.12 定数式中の組込み関数 [5.2(部分的)、5.3(完全に)]
定数式内で定数引数を持つ任意の組込み関数を使用できるようになりました。 (Fortran 95では実数及び複素数組込み関数は使用できませんでした。)例:
MODULE m REAL,PARAMETER :: e = EXP(1.0) END
9.8.13 宣言関数が再帰的でも良い [6.2]
宣言式で使われる関数が再帰的(RECURSIVE属性で定義される)であってもよくなりました。 例:PURE INTEGER FUNCTION factorial(n) RESULT(r) INTEGER,INTENT(IN) :: n IF (n>1) THEN r = n*factorial(n-1) ELSE r = 1 END IF END FUNCTION上記関数は宣言式でも利用できます。
9.8.14 コマンド行へのアクセス [5.1]
組込み手続きCOMMAND_ARGUMENT_COUNT, GET_COMMAND, and GET_COMMAND_ARGUMENTが追加されました。 これらは従来、F90_UNIX_ENVモジュールからのIARGCとGETARG 手続きでのみ利用できた機能を重複して提供するものです。
INTEGER FUNCTION command_argument_count()これはコマンドライン引数の数を応答として返します。 F90_UNIX_ENVモジュール中のIARGCとは異なり、これはコマンド名が取得 できない場合でも0を応答として返します。
SUBROUTINE get_command(command,length,status) CHARACTER(*),INTENT(OUT),OPTIONAL :: command INTEGER,INTENT(OUT),OPTIONAL :: length,statusこれはプログラムをコールした際のコマンド行にアクセスします。それはコマンド 名と空白で仕切られた引数を連結して構成されます。 ユーザが実際に打ち込んだものとは異なる可能性があるのでなるべく使わないでく ださい(代りにGET_COMMAND_ARGUMENTを使用してください)。
COMMANDが存在する場合にはそれはコマンドを取得します(必要に応じて空 白でパディング、もしくは切り詰められます)。 LENGTHが存在する場合にはそれはコマンド長を取得します。 STATUSが存在する場合、それはCOMMANDが短くてコマンド全体を収容 できないときに−1に、コマンドが取得できないときに正の数に、それ以外のときに 0にセットされます。
SUBROUTINE get_command_argument(number,value,length,status) INTEGER,INTENT(IN) :: number CHARACTER(*),INTENT(OUT),OPTIONAL :: value INTEGER,INTENT(OUT),OPTIONAL :: length,statusこれはコマンド行引数のNUMBER番目にアクセスします。ここで引数ゼロは プログラム名です。 VALUEが存在する場合、それは引数テキストを取得します(引数の長さと VALUEの長さが異なる場合には、必要に応じて空白でのパディング、もし くは切詰めが行われます)。 LENGTHが存在する場合、それは引数の長さを取得します。 STATUSが存在する場合、それは成功したときにはゼロに、VALUEが 短すぎるときには−1に、エラーが生じたときには正の数にセットされます。
NUMBERがゼロより小さい、もしくは引数の数 (COMMAND_ARGUMENT_COUNTにより返される値)より大きい場合はエラー となる点に注意してください。
9.8.15 環境変数へのアクセス [5.1]
組込み手続きGET_ENVIRONMENT_VARIABLEが追加されました。 これは従来、F90_UNIX_ENVモジュール中のGETENV手続きを介して のみ利用できた機能を重複して提供するものです。SUBROUTINE get_environment_variable(name,value,length,status,trim_name) CHARACTER(*),INTENT(IN) :: name CHARACTER(*),INTENT(OUT),OPTIONAL :: value INTEGER,INTENT(OUT),OPTIONAL :: length,status LOGICAL,INTENT(IN),OPTIONAL :: trim_name ENDこれはNAMEで指定される環境変数をアクセスします。NAME中の末尾の 空白は、TRIM_NAMEが存在し且つ値が.FALSE.である場合を除き、無視 されます。 VALUEが存在する場合、それは変数のテキスト値を取得します(値の長さと VALUEの長さが異なる場合には、必要に応じて空白でのパディング、もしくは 切詰めが行われます)。 LENGTHが存在する場合、それは値の長さを取得します。 STATUSが存在する場合、それは環境変数が存在しないときには値1に、 VALUEが短すぎるときには−1に、成功したときには0にセットされます。 特殊なエラー条件によっては他の正の値が代入されることもあります。
9.8.16 文字種別選択 [5.1]
組込み関数SELECTED_CHAR_KINDが追加されました。 現在サポートされている文字セットは'ASCII'のみです。9.8.17 引数渡しの緩和 [5.1]
CHARACTER配列を受け取ることを期待しているルーチンにCHARACTER スカラ実引数を渡せるようになりました。 ただし配列は形状明示配列、または大きさ引継ぎ配列(すなわち形状引継ぎ配列、 割付け配列、ポインタ配列ではないもの)である必要があります。 これはC相互運用性という面で有用です。9.8.18 MAXLOCとMINLOC組込み関数 [5.1]
MAXLOCとMINLOC組込み関数はFortran 2003で要求されるように、 空集合位置に対してゼロを応答として返すようになりました(Fortran 95では この結果はプロセッサ依存でした)。9.8.19 VALUE属性 [4.x]
VALUE属性は引数が値で引き渡されることを指定します。9.8.19.1 構文
VALUE属性はVALUE文で指定するか、もしくは型宣言文の中で VALUEキーワードを用いて指定します。VALUE文の構文は次のとおりです:
VALUE [ :: ] name [ , name ] ...
VALUE属性はスカラ仮引数にのみ指定可能です。 仮引数が文字型の場合、その文字長は定数で1に等しくなければなりません。
VALUE仮引数を持つ手続きは明示的な引用仕様を持つものでなくてはなりません。
9.8.19.2 セマンティクス
VALUE属性を持つ仮引数は“値渡し”です。これは引数の局所コピーがルー チンに入る際に作られ、仮引数への変更は結合された実引数に影響を与えない、また逆 も真であることを意味します。VALUE仮引数はINTENT(IN)は許されますが INTENT(INOUT)もしくはINTENT(OUT)は許されません。
9.8.19.3 用例
PROGRAM value_example INTEGER :: i = 3 CALL s(i) PRINT *,i ! This will print the value 3 CONTAINS SUBROUTINE s(j) INTEGER,VALUE :: j j = j + 1 ! This changes the local J without affecting the actual argument PRINT *,j ! This will print the value 4 END SUBROUTINE ENDこの例は特に実用性を意図したものではなく、単に機能を紹介するためのものです。
9.8.20 VOLATILE属性 [5.0]
これはFortran以外の手段により変数が変更できることを指定する恐ろしい属性です。 セマンティクスはC ‘volatile’型修飾子と基本的に同一です。 本質的にこの指定により該当変数へのアクセスに関する最適化は行われなくなります。9.8.21 機能強化された複素定数 [5.2]
実部と虚部に名前付き定数が指定できるようになりました。定数表現に限られません。例:
REAL,PARAMETER :: minusone = -1.0 COMPLEX,PARAMETER :: c = (0,minusone)CMPLX組込み関数で同じ事が可能であるため、これは特に有用というわけでは ありません。
9.8.22 ASSOCIATE構文 [5.2]
ASSOCIATE構文はブロックの実行中、“結合名”と指定された変数もしくは 値の間に一時的な結合を設定します。 構文は次のとおりです。
ASSOCIATE ( association [ , association ]... )
block
END ASSOCIATE
name => expression
name => variable
name
結合名の型は結合されている式や変数のものとなります。
例:
ASSOCIATE(zoom=>NINT(SQRT(a+b)), alt=>state%mapval(:,i)%altitude) alt%x = alt%x*zoom alt%y = alt%y*zoom END ASSOCIATEこの例でALTは変数と結合されているので変更可能ですが、ZOOMは変更 できません。ZOOMの式はINTEGER型であるのでZOOMもまた INTEGER型となります。
9.8.23 2進、8進及び16進定数 [5.2]
Fortran 95ではこれらはDATA文でのみ使用可能でしたが、Fortran 2003では 組込み関数CMPLX, DBLE, INT, REALの引数としても 許容されるようになりました。 解釈はプロセッサ依存ですが、その意図は複素数もしくは実数の内部表現を指定する ことにあります。 nAG Fortranコンパイラの場合、これらの定数は指定された種別の複素数もしくは 実数の正しい長さ(32もしくは64ビット)を持つことが必要となります。例えばデフォルトの実数がIEEE単精度のマシンの場合、
REAL(z"41280000")は10.5の値を持ちます。
9.8.24 文字セット [5.1、5.3]
複数文字セットに対するサポート、特にUnicode(ISO 10646)に対するサポートが改善 されました。デフォルトの文字セットとしては小文字とすべての7ビットASCII印刷可能文字を含む ことが必須となりました。
OPEN文とINQUIRE文のENCODING=指定子については入出力セク ションで記述されています。
新しい組込み関数SELECTED_CHAR_KIND(NAME)が追加されました。 この関数は名前付き文字セットに対する文字種別を、もしくはその文字セットに文字 種別が何もない場合には−1を応答として返します。 標準文字セット名はデフォルトの文字種別の場合が'DEFAULT'、7ビットASCII 文字セットの場合は'ASCII'、UCS-4(32ビットUnicode)文字セットの場合は 'ISO_10646'です。 名前には大文字小文字の区別がありません。 UCS-4文字を要求する方法は標準化されていますが、コンパイラがそれをサポートする ことは必須ではないことに注意して下さい(サポートしていない場合には−1が返され ます)。nAG Fortranコンパイラはリリース5.3においてUCS-4(及びUCS-2とJIS X 0213)をサポートします。
ある種別の文字の値をそれとは異なる種別の文字の値に対し代入することは、その各々 がデフォルト文字、ASCII文字、UCS-4文字のいずれかである場合に許されます。 UCS-4文字変数への代入、もしくはUCS-4文字変数からの代入は、元の値を維持します。
UCS-4文字種別の変数に対する内部ファイル入出力は(その種別が存在する場合に) 許されます。これには数値変換(例えばE編集記述子)、デフォルト文字とASCII文字 間での変換も含まれています。 同様にデフォルト文字、ASCII文字、UCS-4文字の値をUTF-8ファイルに書き出したり それを読み込むことは許されていて、値は維持されます。
最後に、(文字をASCII文字セットに変換するための)組込み関数IACHARはど のような種別の文字も受け付けます(Fortran 95ではデフォルト種別のみでした)。
9.8.25 64ビットマシン用組込み関数の変更 [5.2]
32ビットよりも大きなアドレス空間を持ちながら32ビットデフォルト整数のマシン をサポートするために、いくつかの組込み関数が省略可能なKIND引数を引数 並びの最後に持つようになりました。これによりどの種別の整数を応答として返す かを指示できるようになります。 関連する関数はCOUNT, INDEX, LBOUND, LEN, LEN_TRIM, SCAN, SHAPE, SIZE, UBOUND, VERIFYです。9.8.26 その他の組込み手続きの変更 [5.2]
組込みサブルーチンDATE_AND_TIMEの3つの引数(DATE, TIME, ZONE)は最低の長さを持たなくても良くなりました。 実引数が小さすぎる場合には代入される値の切り詰めが行われます。組込み関数IACHARとICHARが省略可能なKIND引数を受け付ける ようになりました。これにより文字の値を変換する先の整数種別を指定できます。 これは32ビットより大きな文字セットがないので、現状役には立ちません。
組込み関数MAX, MAXLOC, MAXVAL, MIN, MINLOC, MINVALはすべて文字値を受け付けるようになりました。 比較として使われるのは本来のもの(.LT.)であり、ASCIIのもの(LLT) ではありません。
組込みサブルーチンSYSTEM_CLOCKが実数型のCOUNT_RATE引数を受け 付けるようになりました。これはクロック刻みが1秒の整数除数でないシステムに 対応するためのものです。