Fortran: parameters/variables 在外部文件中
Fortran: parameters/variables in external file
我有几个程序在开始时使用相同的代码块,但执行不同的操作。是否可以在外部文件(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
语句之后。
有什么想法吗?
如果不进行某种形式的重组,您似乎想做的事情是不可能的。原因是行
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
构造 - 我不会表现出这种肮脏。]
我有几个程序在开始时使用相同的代码块,但执行不同的操作。是否可以在外部文件(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
语句之后。
有什么想法吗?
如果不进行某种形式的重组,您似乎想做的事情是不可能的。原因是行
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
构造 - 我不会表现出这种肮脏。]