この規格ページの目次
407
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
(FORTRAN 66 及
質的な利点があるように,明示的引用仕様に関する要求規定によって,引数結合を実装するために,
び FORTRAN 77 と同じ)単純な機構で十分か,又は より一般性のある機構が必要であるかを決定できる(12.3.1.1
参照)。すなわち,処理系は,手続の引用仕様が FORTRAN 77 の機能だけを使用している場合にはその手続では単純
な機構を想定し,それ以外の場合(例えば,形状引継ぎの引数 又は 省略可能な引数がある場合)には,より一般性
のある機構を想定するという実装方式をとることができる。引用の時点では,引用仕様が明示的である場合にはその
引用仕様から適切な機構を判断でき,引用仕様が暗黙的である場合には単純な機構を使用すればよい。
注記 手続の想定している機構が単純な機構であると判断できた場合には,処理系は,実引数のために連続し
た一時的な記憶場所を割り付け,実引数を一時的な記憶場所に複写し,実引数の代わりに一時的な記憶場
所を用いて手続を引用し,一時的な記憶場所の中身を実引数に複写し直し,一時的な記憶場所を解放する
必要があるかもしれない。
上の実装方式は,これらの規則の設計の根拠となったものではあるが,唯一の可能な実装方式というわけではない。
例えば,ある処理系において,FORTRAN 77 の引数結合に必要な情報は FORTRAN 77 の場合と同じ場所に置き,“付
加的な” 情報は FORTRAN 77 の引数結合だけを想定している手続の処理を妨げない場所に置く,という方法で一般的
な引数結合を実装することもできる。このような実装方式であれば,引数結合の翻訳は,引用仕様が明示的であるか
暗黙的であるかとは無関係にできる。
式の評価に関する規定は,最も効率的な方法で式の値を得られるように,かなりの柔軟性を処理系に与えている。
例えば,式の値を他の方法で決定できる場合には,演算対象を評価しなかったり部分的にだけ評価したりしてもよい
(7.1.8.1 参照)。この柔軟性は,関数の引数の評価にも適用され,引数の評価順序の変更,引数の評価の遅延 及び 引
数の評価の省略が許される。処理系は,引数の評価を遅らせることがプログラムの結果に影響を及ぼさないならば,
手続の実行がその引数の値を参照するまで,手続引用の中の引数の評価を遅らせてもよい。同様の制約のもとで処理
(例えば,並列処理
系は,手続の実行中に引用されない引数の評価を完全に省略してもよい。このことは,処理系に,
のような)最適化のための自由を与えている。
C.9.6 引数としてのポインタ 及び 指示先(12.4.1.2 参照)
仮引数をポインタとして宣言した場合には,それはポインタである実引数とだけ結合することができ,仮引数と実
引数の特性は,一致しなければならない。そのような結合に対する実装モデルの一つは,実ポインタの記述子の値を
仮ポインタに複写するものである。実ポインタが指示先と結合している場合には,その指示先は仮ポインタを通して
参照できるようになる。仮ポインタが,手続の実行中に別の指示先と結合した場合には,この指示先は,手続の実行
が終了した後も実ポインタを通して参照できる。仮ポインタが,その手続の終了時に存在しなくなる局所的な指示先
と結合した場合には,その実ポインタは,“遊離した” ままの不定状態になる。このような状態のポインタを使用する
ことはできない。
手続の実行が終了した時,TARGET 属性をもつスカラ 又は 形状引継ぎ配列である仮引数と結合していて,かつ
確定になっているポインタは,その仮引数に対応する実引数が TARGET 属性をもち,ベクトル添字をもつ部分配列
でない場合に,その実引数と結合したままになる。
例 REAL, POINTER :: PBEST
REAL, TARGET :: B (10000)
CALL BEST (PBEST, B) ! 戻った時,PBEST は B の最適な 要素と
... ! 結合している。
CONTAINS
SUBROUTINE BEST (P, A)
REAL, POINTER, INTENT (OUT) :: P
REAL, TARGET, INTENT (IN) :: A (:)
... ! 最適な要素 A(I) を見つける。
P => A (I)
――――― [JIS X 3001-1 pdf 421] ―――――
408
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
RETURN
END SUBROUTINE BEST
END
手続 BEST が終了した時,ポインタ PBEST は B の 1 要素と結合している。
TARGET 属性をもたない実引数と,TARGET 属性をもつ仮引数が結合してもよい。これによって,そのような仮
引数を含む手続の実行中に,ポインタがその仮引数と結合することが許される。
例 INTEGER LARGE(100,100)
CALL SUB (LARGE)
...
CALL SUB ()
CONTAINS
SUBROUTINE SUB(ARG)
INTEGER, TARGET, OPTIONAL :: ARG(100,100)
INTEGER, POINTER, DIMENSION(:,:) :: PARG
IF (PRESENT(ARG)) THEN
PARG => ARG
ELSE
ALLOCATE (PARG(100,100))
PARG = 0
ENDIF
... ! この部分に PARG の引用を多数含む。
IF (.NOT. PRESENT(ARG)) EALLOCATE(PARG)
END SUBROUTINE SUB
END
サブルーチン SUB 中で,ポインタ PARG は,仮引数 ARG 又は 割り付けられた指示先のどちらかと結合す
る。このサブルーチンの大部分では,これ以外に組込み関数 PRESENT を呼び出さずに PARG を引用できる。
C.9.7 多相的引数結合(12.4.1.3 参照)
次の例は,例 4.54 で定義された派生型を使って多相的引数結合の規則を示している。
例 TYPE(POINT) :: T2
TYPE(COLOR_POINT) :: T3
CLASS(POINT) :: P2
CLASS(COLOR_POINT) :: P3
! 仮引数が多相的であり,実引数が固定の型である。
SUBROUTINE SUB2 ( X2 ); CLASS(POINT) :: X2; ...
SUBROUTINE SUB3 ( X3 ); CLASS(COLOR_POINT) :: X3; ...
CALL SUB2 ( T2 ) ! 正しい -- T2 の宣言時の型が X2 の宣言時の型と同じ。
CALL SUB2 ( T3 ) ! 正しい -- T3 の宣言時の型が X2 の宣言時の型から拡張されている。
CALL SUB3 ( T2 ) ! 誤り -- T2 の宣言時の型は,X3 の宣言時の型とは同じでもなく,
! X3 の宣言時の型から拡張されたものでもない。
CALL SUB3 ( T3 ) ! 正しい -- T3 の宣言時の型が X3 の宣言時の型と同じ。
! 実引数が多相的であり,仮引数が固定の型である。
SUBROUTINE TUB2 ( D2 ); TYPE(POINT) :: D2; ...
SUBROUTINE TUB3 ( D3 ); TYPE(COLOR_POINT) :: D3; ...
CALL TUB2 ( P2 ) ! 正しい -- P2 の宣言時の型が D2 の宣言時の型と同じである。
CALL TUB2 ( P3 ) ! 誤り -- P3 の宣言時の型が D2 の宣言時の型とは異なる。
CALL TUB2 ( P3%POINT ) ! 上記の例に代わる正しい例。
CALL TUB3 ( P2 ) ! 誤り -- P2 の宣言時の型が D3 の宣言時の型とは異なる。
SELECT TYPE ( P2 ) ! 上記の例に代わる正しい条件の例。
CLASS IS ( COLOR_POINT ) ! P2 の実行時の型が D3 の宣言時の型と同じであるか
――――― [JIS X 3001-1 pdf 422] ―――――
409
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
CALL TUB3 ( P2 ) ! 又は D3 の宣言時の型から拡張された型である場合に
! 動作する。
CLASS DEFAULT
! そうでない場合には動作しない。
END SELECT
CALL TUB3 ( P3 ) ! 正しい -- P3 の宣言時の型が D3 の宣言時の型と同じである。
! 実引数と仮引数の両方が多相的な型である。
CALL SUB2 ( P2 ) ! 正しい -- P2 の宣言時の型が X2 の宣言時の型と同じである。
CALL SUB2 ( P3 ) ! 正しい -- P3 の宣言時の型が X2 の宣言時の型からの拡張である。
CALL SUB3 ( P2 ) ! 誤り -- P2 の宣言時の型は,X3 の宣言時の型と同じでもなく,
! X3 の宣言時の型から拡張されたものでもない。
SELECT TYPE ( P2 ) ! 直前の例に代わる正しい条件の例。
CLASS IS ( COLOR_POINT ) ! P2 の実行時の型が X3 の宣言時の型と同じであるか
CALL SUB3 ( P2 ) ! 又は X3 の宣言時の型から拡張された型である場合に
! 動作する。
CLASS DEFAULT
! そうでない場合には動作しない。
END SELECT
CALL SUB3 ( P3 ) ! 正しい -- P3 の宣言時の型が X3 の宣言時の型と同じである。
C.10 箇条 15 の注記
C.10.1 実行環境
この規格では,プログラムに,Fortran 以外の手段によって定義されている手続を含むことができる。これは,実
行環境の初期化の問題 及び 実行環境間の相互作用の問題を引き起こす。
次のことができれば,適切にこれらの問題を解決するための実装は自由である。
(1) ヒープの割付け 及び 解放(例えば,Fortran サブプログラムにおける ALLOCATE 文 及び DEALLOCATE 文,
並びに 言語 C の関数における malloc 及び free)は,干渉せずに実行できる。
(2) 外部ファイルに対する入出力は,別の手段によって定義された手続が,同じ外部ファイルに対して入出力を行う
場合を除いて,干渉せずに実行できる。
(3) 入出力の事前接続は,各言語の規格によって要求されるように存在する。
(4) 初期化されるデータは,各言語の規格に従って初期化される。
C.10.2 Fortran と言語 C の関数との相互利用可能性の例
次の二つの例は,Fortran と言語 C の関数との相互利用可能性を示す。一つは Fortran から言語 C を呼び出す例,
もう一つは言語 C から Fortran を呼び出す例である。それぞれの例で,Fortran 実引数,Fortran 仮引数 及び 言語 C
の仮引数の対応を示す。
C.10.2.1 Fortran から言語 C を呼び出す例
言語 C の関数原型 :
int C_Library_Function(void* sendbuf, int sendcount,
int *recvcounts);
Fortran のモジュール :
MODULE FTN_C_1
USE, INTRINSIC :: ISO_C_BINDING
END MODULE FTN_C_1
MODULE FTN_C_2
INTERFACE
INTEGER (C_INT) UNCTION C_LIBRARY_FUNCTION &
――――― [JIS X 3001-1 pdf 423] ―――――
410
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
(SENDBUF, SENDCOUNT, RECVCOUNTS) &
BIND(C, NAME= C_Library_Function )
USE FTN_C_1
IMPLICIT NONE
TYPE (C_PTR), VALUE :: SENDBUF
INTEGER (C_INT), VALUE :: SENDCOUNT
TYPE (C_PTR), VALUE :: RECVCOUNTS
END FUNCTION C_LIBRARY_FUNCTION
END INTERFACE
END MODULE FTN_C_2
モジュール FTN C 2 は,言語 C の仮引数に対応する Fortan の仮引数の宣言を含む。モジュール FTN C 1 内では,組込み
モジュール ISO C BINDING を参照している。BIND 属性の NAME 指定子によって,Fortran の ’C LIBRARY FUNCTION’
を言語 C の大文字と小文字を区別する名前 ’C Library Function’ に変更している。注記 12.39 も参照せよ。
言語 C の 1 番目の仮引数は void 型の sendbuf へのポインタであり,C PTR 型であって VALUE 属性をもつ Fortran
仮引数 SENDBUF に対応する。
言語 C の 2 番目の仮引数は int 型の sendcount であり,INTEGER(C INT) 型であって VALUE 属性をもつ Fortran
仮引数 SENDCOUNT に対応する。
言語 C の 3 番目の仮引数は int 型の recvcounts へのポインタであり, C PTR 型であって VALUE 属性をもつ
Fortran 仮引数 RECVCOUNTS に対応する。
Fortran の呼出し列
USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT, C_FLOAT, C_LOC
USE FTN_C_2
...
REAL (C_FLOAT), TARGET :: SEND(100)
INTEGER (C_INT) :: SENDCOUNT
INTEGER (C_INT), ALLOCATABLE, TARGET :: RECVCOUNTS(:)
...
ALLOCATE( RECVCOUNTS(100) )
...
CALL C_LIBRARY_FUNCTION(C_LOC(SEND), SENDCOUNT, &
C_LOC(RECVCOUNTS))
...
先行するコードは,上に示した Fortran 仮引数と結合する Fortran 実引数の宣言を含む。
Fortran の 1 番目の実引数は,配列 SEND の第 1 要素のアドレスであり,REAL(C FLOAT) 型であって TARGET 属
性をもつ。このアドレスは,組込み関数 C LOC が返す。この実引数は,C PTR 型であって VALUE 属性をもつ Fortran
仮引数 SENDBUF と結合する。
Fortran の 2 番目の実引数は,INTEGER(C INT) 型の SENDCOUNT であり,INTEGER(C INT) 型であって VALUE
属性をもつ Fortran 仮引数 SENDCOUNT と結合する。
Fortran の 3 番目の実引数は,割付け配列 RECVCOUNTS の第 1 要素のアドレスであり,REAL(C FLOAT) 型であっ
て TARGET 属性をもつ。このアドレスは,組込み関数 C LOC が返す。この実引数は,C PTR 型であって VALUE
属性をもつ Fortran 仮引数 RECVCOUNTS と結合する。
C.10.2.2 言語 C から Fortran を呼び出す例
Fortran のコード :
SUBROUTINE SIMULATION(ALPHA, BETA, GAMMA, DELTA, ARRAYS) BIND(C)
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
INTEGER (C_LONG), VALUE :: ALPHA
――――― [JIS X 3001-1 pdf 424] ―――――
411
附属書 C
X 3001-1 : 2009 (ISO/IEC 1539-1 : 2004)
REAL (C_DOUBLE), INTENT(INOUT) :: BETA
INTEGER (C_LONG), INTENT(OUT) :: GAMMA
REAL (C_DOUBLE),DIMENSION(*),INTENT(IN) :: DELTA
TYPE, BIND(C) :: PASS
INTEGER (C_INT) :: LENC, LENF
TYPE (C_PTR) :: C, F
END TYPE PASS
TYPE (PASS), INTENT(INOUT) :: ARRAYS
REAL (C_FLOAT), ALLOCATABLE, TARGET, SAVE :: ETA(:)
REAL (C_FLOAT), POINTER :: C_ARRAY(:)
...
! C_ARRAY を言語 C で割り付けられた配列と結合する
CALL C_F_POINTER (ARRAYS%C, C_ARRAY, (/ARRAYS%LENC/) )
...
! 配列を割り付け,言語 C で利用できるようにする
ARRAYS%LENF = 100
ALLOCATE (ETA(ARRAYS%LENF))
ARRAYS%F = C_LOC(ETA)
...
END SUBROUTINE SIMULATION
言語 C の構造体宣言 :
struct pass [{int lenc, lenf; float *c, *f;}];
言語 C の関数原型 :
void simulation(long alpha, double *beta, long *gamma,
double delta[], struct pass *arrays);
言語 C の呼出し列 :
simulation(alpha, &beta, &gamma, delta, &arrays);
上に示した Fortran コードは,サブルーチン SIMULATION を記述している。このサブルーチンは,言語 C の void 型
関数 simulation に対応する。
Fortran サブルーチンは,組込みモジュール ISO C BINDING を参照する。
このサブルーチンの 1 番目の Fortran 仮引数は,INTEGER(C LONG) 型であって VALUE 属性をもつ ALPHA であ
る。この仮引数は,言語 C の long 型仮引数 alpha に対応する。
2 番目の Fortran 仮引数は,REAL(C DOUBLE) 型であって INTENT(INOUT) 属性をもつ BETA である。この仮
引数は,言語 C の double 型へのポインタである仮引数 beta に対応する。言語 C の呼出し列における実引数として
アドレスが渡される。
3 番目の Fortran 仮引数は,INTEGER(C LONG) 型であって INTENT(OUT) 属性をもつ GAMMMA である。この仮
引数は,言語 C の long 型へのポインタである仮引数 gamma に対応する。言語 C の呼出し列における実引数としてア
ドレスが渡される。
4 番目の Fortran 仮引数は,REAL(C DOUBLE) 型であって INTENT(IN) 属性をもつ,大きさ引継ぎ配列 DELTA
である。この仮引数は,言語 C の double 型配列である仮引数 delta に対応する。言語 C の実引数も double 型配列
である。
5 番目の Fortran 仮引数は,言語 C で割り付けられた配列 及び Fortran で割り付けられた配列にアクセスするた
めの構造体 ARRAYS である。これらの配列の長さは,成分 LENC 及び LENF に保持され,それらの C アドレスは成分 C
及び F に保持される。
C.10.2.3 相互利用できないデータを用いた言語 C を呼び出す例
多くの Fortran 処理系は,言語 C 処理系が用意しないことがある 16 バイトの実数を用意する。
――――― [JIS X 3001-1 pdf 425] ―――――
次のページ PDF 426
JIS X 3001-1:2009の引用国際規格 ISO 一覧
- ISO/IEC 1539-1:2004(IDT)
JIS X 3001-1:2009の国際規格 ICS 分類一覧
- 35 : 情報技術.事務機械 > 35.060 : 情報技術に使用される言語
JIS X 3001-1:2009の関連規格と引用規格一覧
- 規格番号
- 規格名称