Fortran:外部文件中的参数/变量

时间:2015-02-03 22:09:16

标签: fortran gfortran

我有几个程序在开始时使用相同的代码块,但执行不同的操作。是否可以在外部文件(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声明。

有什么想法吗?

1 个答案:

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