使用子程序将程序转换为模块时出错

errors when transforming program into module with subroutine

给定一个简单的程序,它运行得很好,例如:

program test
implicit none
real, allocatable :: x(:)
real :: su, si
allocate(x(3))
x(:) = (/1,2,3/)
su=sum(x(:))
si=size(x(:))
end program

我试着用子程序把它改造成一个外部模块:

module test
implicit none
real, allocatable, intent(in) :: x(:)
real, intent(out) :: su, si
contains
subroutine sumsize(x(:),su,si)
    su=sum(x(:))
    si=size(x(:))
end subroutine
end module

但是我无法用几条错误消息对其进行编译,我认为其中大部分是基于 x(:)susi 都不是 DUMMY 变量.

在哪里以及如何定义假人?看起来这是一个简单的形式错误。

另一个错误指出子程序头中的垃圾,并在使用 subroutine sumsize(x,su,si) 定义它时消失。为什么子程序的输入不能是向量?

通过 gfortran -ffree-form -c module_test.f -o test.o 使用 gfortran - gcc v. 8.3.0-6 (Debian) 编译。

伪参数,在其他编程语言中也称为函数参数,必须在函数或子例程内声明。

此外,参数列表(子例程名称后括号中的参数名称)不应包含任何额外的括号。

module test
  implicit none

contains

  subroutine sumsize(x,su,si)    
    real,  intent(in) :: x(:)
    real, intent(out) :: su, si

    su=sum(x(:))
    si=size(x(:))
  end subroutine
end module

此外,您通常不希望伪参数为 allocatable。这通常在子例程内分配或释放数组时使用,或者如果您希望允许使用未分配的数组。

program test
  implicit none

  real, allocatable :: main_x(:)
  real :: main_su, main_si

  allocate(main_x(3))
  main_x(:) = (/1,2,3/)

  call  sumsize(main_x, main_su, main_si)
end program

我用 main_ 前缀重命名了变量。不需要,只是为了区别于子程序内部的名称。