回 帖 发 新 帖 刷新版面

主题:求教FORTRAN子程序能否像数组一样循环

对于数组循环有FORALL和WHERE之类的函数

想问一下如何实现子程序类似的功能呢?

例如

REAL(8), DIMENSION(2) :: A
REAL(8), DIMENSION(3) :: B
REAL(8), DIMENSION(2,3) :: C
!ADD是一个子程序
EXTERNAL :: ADD

!用类似数组的函数实现循环调用子程序
FORALL(I=1:2,J=1:3) CALL ADD(A(I),B(J),C(I,J))

回复列表 (共6个回复)

沙发

补充一下,就是可不可以用一行代码实现下面的语句

Do I=1,2
   Do J=1,3
      CALL ADD(A(I),B(J),C(I,J))
   End Do
End Do

板凳

Take a try, and you'll see.

3 楼

不行啊,我编了一下,程序报错。
Program FORALLCALL
REAL(8), DIMENSION(2) :: A = (/1.D0, 2.D0/)
REAL(8), DIMENSION(3) :: B = (/1.D0, 2.D0, 3.D0/)
REAL(8), DIMENSION(2,3) :: C
EXTERNAL :: ADD

FORALL(I=1:2,J=1:3) CALL ADD(A(I),B(J),C(I,J))

End Program

Subroutine ADD(A, B, C)
Real(8) :: A, B, C
C = A+B
End Subroutine

4 楼

楼主:Forall结构只能用来设置数组值相关的程序命令,所以出现CALL ADD(A(I),B(J),C(I,J))不允许的。

5 楼

在FORALL中,你可以用函数,但不可以用子程序。
不过函数也仅限PURE类型的函数(ELEMENTAL应该也行的)。

6 楼

当然,如果你的PURE函数里调用了PURE的子程序,那也是允许的:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册