我写了这段代码,但我不知道为什么它不起作用。我认为这主要是因为滥用子程序。我知道子程序的格式是什么,但不知道这有什么问题。任何人都可以为我调试此代码吗?感谢。
PROGRAM AKI
IMPLICIT NONE
INTEGER:: i,j,k,l,m,n
REAL :: R2,R1,dteta,dr
REAL ,DIMENSION (0:100) :: teta,r
REAL,DIMENSION(0:100,0:100) :: x,y
CALL SETUP
CALL GRID
CALL SAVING
PAUSE
END PROGRAM
SUBROUTINE SETUP
REAL , DIMENSION (0:100) :: teta,r
R2 = 10
R1 = 5
dr = (R2 - R1) / 9
r(1) = 5
DO i = 1,9
r(i+1) = r(i) + dr
END DO
RETURN
END
SUBROUTINE GRID
REAL , DIMENSION(0:100) :: teta,r
REAL , DIMENSION(0:100,0:100) :: x,y
dteta = (2 * 3.1415)/9
teta(1) = 0
DO j= 1 , 9
teta(j+1) = teta (j) + dteta
END DO
DO i = 1 , 10
DO j = 0 , 10
x(i,j) = r(i)*cos(teta(j))
y(i,j) = r(i)*sin(teta(j))
END DO
END DO
RETURN
END
SUBROUTINE SAVING
REAL , DIMENSION(0:100,0:100) :: x,y
OPEN( 1, file= "solution.dat")
DO i = 1,10
DO j = 1,10
WRITE(1, *) x(i,j),y(i,j)
END DO
END DO
CLOSE(1)
RETURN
END
答案 0 :(得分:3)
您的问题是您没有将参数传递给子例程。您对SETUP
,GRID
和SAVING
的来电均使用自己的本地范围变量。您使用隐式类型进一步混淆了这种情况,允许您使用未明确声明的变量。试试这个:
subroutine SETUP(r)
implicit none
REAL , DIMENSION (0:100), intent(out) :: r
real :: R2, R1, dr
R2 = 10
R1 = 5
dr = (R2 - R1) / 9
r(1) = 5
DO i = 1,9
r(i+1) = r(i) + dr
END DO
RETURN
END subroutine
并将其命名为
call SETUP(r)
您需要对其他子例程进行类似的调整。
如果您想要使用这些变量而不将它们传递给每个子例程,您可以使用主机范围并在contains
语句之后和end program
语句之前在主程序中包含子例程。在这种情况下,你根本不会在子程序中声明它们,你只需要使用它们。