INTERFACE文 |
INTERFACE [総称指定] : END INTERFACE |
総称指定には、次の3つがある。
[例1] |
PROGRAM main INTERFACE SUBROUTINE sort(a) INTEGER,DIMENSION(:),INTENT(INOUT) :: a END SUBROUTINE sort END INTERFACE INTEGER,DIMENSION(5) :: data data=(/10,13,3,55,78/) CALL sort(data) WRITE(*,*) data END PROGRAM main SUBROUTINE sort(a) INTEGER,DIMENSION(:),INTENT(INOUT) :: a INTEGER,DIMENSION(1) :: mm INTEGER :: i,w,m INTRINSIC SIZE,MINLOC DO i=1,SIZE(a)-1 mm=MINLOC(a(i:)); m=mm(i)+i-1 w=a(i); a(i)=a(m); a(m)=w END DO END SUBROUTINE sort
[例2] |
INTERFACE !手続引用使用宣言 SUBROUTINE sub(x,y,z) INTEGER,INTENT(IN) :: x INTEGER,INTENT(IN),OPTIONAL :: y INTEGER,INTENT(OUT) :: z END SUBROUTINE sub END INTERFACE
[例3] |
INTEGER :: a,b REAL :: x,y CALL sub(a,b) !isubがCALLされる CALL sub(x,y) !asubがCALLされる INTERFACE sub SUBROUTINE isub(x,y) INTEGER,INTENT(IN) :: x,y END SUBROUTINE isub SUBROUTINE asub(x,y) REAL,INTENT(IN) :: x,y END SUBROUTINE asub END INTERFACE sub
[例] |
goukei=a_ten .ADD. b_ten
利用者定義演算子は、モジュールの中のINTERFACE文で定義する。
演算子.ADD.は、addstr関数で加算の関数を作成する。関数内では、
入力の引数aとbを明示的にINTENT(IN)を指定する必要がある。
MODULE structure
TYPE str
INTEGER :: first,second
END TYPE str
INTERFACE OPERATOR(.ADD.) !利用者定義演算子の定義
MODULE PROCEDURE addstr
END INTERFACE
CONTAINS
FUNCTION addstr(a,b) RESULT(c) !構造体の加算関数
TYPE(str),INTENT(IN) :: a,b
TYPE(str) :: c
c%first =a%first +b%first
c%second=a%second+b%second
END FUNCTION addstr
END MODULE structure
PROGRAM main !主プログラム
USE structure !モジュールの使用宣言
TYPE(str) :: a_ten,b_ten,goukei
a_ten=str(10,20)
b_ten=str(123,456)
WRITE(*,*) a_ten
goukei=a_ten .ADD. b_ten
WRITE(*,*) goukei
END PROGRAM main
[例] |
MODULE bitc INTERFACE ASSIGNMENT(=) MODULE PROCEDURE bitchar END INTERFACE CONTAINS SUBROUTINE bitchar(c,b) CHARACTER (LEN=1),DIMENSION(:),INTENT(OUT) :: c LOGICAL,DIMENSION(:),INTENT(IN) :: b INTEGER :: i INTRINSIC SIZE DO i=1,SIZE(b) IF (b(i)) THEN c(i)='1' ELSE c(i)='0' END IF END DO END SUBROUTINE bitchar END MODULE bitc PROGRAM main USE bitc CHARACTER (LEN=1),DIMENSION(3) :: moji LOGICAL,DIMENSION(3) :: bit bit(1)=.TRUE. ; bit(2)=.TRUE.; bit(3)=.FALSE. moji=bit WRITE(*,*) moji END PROGRAM main