我有几个程序在开始时使用相同的代码块,但执行不同的操作。是否可以在外部文件(fortran文件或文本文件)中声明这个代码块,所以如果我想更改此代码的一部分(在我讨论的块中)我没有在每个程序中改变它?
实施例: 两个程序MAIN1和MAIN2,它们与外部文件中生成的向量X进行不同的操作。
PROGRAM MAIN1
IMPLICIT NONE
! External block here
REAL, PARAMETER :: M = REAL(N)*2.0
INTEGER :: i
REAL :: Out1
Out1 = 0.0
DO i = 1,SIZE(X,1)
Out1 = Out1+M*X(i)
END DO
PRINT *, Out1
END PROGRAM MAIN1
PROGRAM MAIN2
IMPLICIT NONE
! External block here
REAL, PARAMETER :: M = 1.0
INTEGER :: i
REAL :: Out2
Out1 = 1.0
DO i = 1,SIZE(X,1)
Out2 = Out2*M*X(i)
END DO
PRINT *, Out2
END PROGRAM MAIN2
这是外部代码:
INTEGER,PARAMETER :: N = 5
REAL :: X(N)
CALL RANDOM_NUMBER(X)
我尝试将外部代码放在一个模块中,但我不能以这种方式调用子程序(据我所知,所有行都应该是INTEGER,PARAMETER :: N = 5
类型)如果想要在之后立即调用外部块IMPLICIT NONE
声明。
有什么想法吗?
答案 0 :(得分:1)
如果没有某种形式的重组,你似乎不想做什么。原因是该行
call random_number(x)
是可执行语句。这样的一行必须遵循所有声明。因此,不允许单个文本文本替换(例如通过include
语句)。
尽管如此,模块是一种可行的方法:它只需要分离声明和可执行语句。
module shared
implicit none
integer, parameter :: N=5
real x(N)
contains
subroutine setup
call random_number(x)
end subroutine
end module
program main1
use shared ! Note _before_ implicit
implicit none
real, parameter :: M=REAL(N)*2
integer i
real Out1
call setup ! Executable, after declarations.
Out1 = 0.0
do i = 1,SIZE(x,1)
Out1 = Out1+M*X(i)
end do
print *, Out1
end program main1
[另一种方法是插入两个不同的文字文本。更糟糕的是,减少到单个插入,将使用block
构造 - 我不会表现出那种肮脏。]