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 构造 - 我不会表现出这种肮脏。]