主プログラムで宣言した配列の大きさを、副プログラム側に引き継ぐ。
副プログラム側では、配列の大きさを宣言する必要がなくなる。
ただし、主プログラム側で、interface文を使う必要がある。
プログラム例
主プログラム:test_cal_sum.f90
program test_cal_sum! Description:!! Author: am!! Host: aofd30! Directory: /work2/am/teaching/21.Fortran/01.interface!! Revision history:! 2011-05-09 08:42! Initial Version! use! implicit none interface subroutine cal_sum(a, s) real,intent(in) :: a(:) real,intent(out) :: s end subroutine cal_sum end interface integer,parameter :: n=10 real a(n) write(*,'(a)')'Program test_cal_sum starts.'! write(*,*)'' do i=1,n a(i)=float(i) enddo !i call cal_sum(a,s) print *,'i, a(i)' do i=1,n print *,i,a(i) enddo !i print * print *,'sum= ',s print * write(*,'(a)')'Done program test_cal_sum.' write(*,*)end program test_cal_sum副プログラム:cal_sum.f90
subroutine cal_sum(a,s)! Description:!! Author: am!! Host: aofd30! Directory: /work2/am/teaching/21.Fortran/01.interface!! Revision history:! 2011-05-09 08:42! Initial Version real,intent(in) :: a(:) real,intent(out) :: s write(*,'(a)')'Subroutine: cal_sum' write(*,*)'' n=size(a,1) print *,'n= ',n do i=1,n s=s+a(i) enddo !i write(*,'(a)')'Done subroutine cal_sum.' write(*,*)end subroutine cal_sum使用例
コンパイル
makefile:
$ make
make: Warning: File `makefile' has modification time 4.3e+02 s in the future
if [ ! -d ../obj ]; then \
mkdir -p ../obj ; \
fi
ifort -c -module ../obj -c -o ../obj/cal_sum.o cal_sum.f90
ifort -c -module ../obj -c -o ../obj/test_cal_sum.o test_cal_sum.f90
ifort -o test_cal_sum ../obj/cal_sum.o ../obj/test_cal_sum.o -module ../obj
make: warning: Clock skew detected. Your build may be incomplete.
real 0m0.097s
user 0m0.054s
sys 0m0.041s
実行例
$ ./test_cal_sum
Program test_cal_sum starts.
Subroutine: cal_sum
n= 10
Done subroutine cal_sum.
i, a(i)
1 1.000000
2 2.000000
3 3.000000
4 4.000000
5 5.000000
6 6.000000
7 7.000000
8 8.000000
9 9.000000
10 10.00000
sum= 55.00000
Done program test_cal_sum.