在Fortran子例程中分配数组

Mse*_*ade 4 fortran memory-management subroutine

我需要从Fortran程序中的文件中读取大量数据.数据的大小是可变的,所以我想动态分配数组.我的想法是创建一个子程序,读取所有数据并分配内存.该计划的简化版本是:

  program main

  implicit none
  real*8, dimension(:,:), allocatable :: v
  integer*4 n

  !This subroutine will read all the data and allocate the memory 
  call Memory(v,n)

  !From here the program will have other subroutines to make calculations

  end


  subroutine Memory(v,n)

  implicit none
  real*8, dimension(:,:), allocatable :: v
  integer*4 n,i

  n=5
  allocate(v(n,2))
  do i=1,n
  v(i,1)=1.0
  v(i,2)=2.0 
  enddo

  return
  end subroutine Memory
Run Code Online (Sandbox Code Playgroud)

这个程序给我以下错误:

Error: Dummy argument 'v' of procedure 'memory' at (1) has an attribute that requieres an explicit interface for this procedure
Run Code Online (Sandbox Code Playgroud)

这是构建这种程序的正确方法吗?如果是这样,我该如何解决错误?

谢谢.

Hig*_*ark 9

假设您有一个包含程序和子例程的源文件,正如您的帖子建议的那样,最简单的解决方法是替换包含该语句的行

end
Run Code Online (Sandbox Code Playgroud)

带有包含该语句的行

contains
Run Code Online (Sandbox Code Playgroud)

并在源文件的末尾写入包含该语句的行

end program
Run Code Online (Sandbox Code Playgroud)

(是的,关键字program不是必需的,但它很有用.)

您的编译器报告的问题是,由于您编写了代码,程序对子例程的接口一无所知memory,该接口在Fortran术语中是隐式的.如果要调用子例程并传入或传出可分配的数组,则子例程必须具有显式接口.

有几种方法可以提供显式接口.正如我已经向您展示的那样,一个是在程序中包含子程序.当程序变得更大时,另一种更有用的方法是在模块中编写子程序,并在想要使用它们的程序中使用它们.阅读包含modules和use语句的Fortran教程部分.

至少有一个其他选择,但特别是初学者,没有吸引力,我不会在这里提到它.

而且,在我写作的过程中,了解并使用该关键字intent来指定是否将读取,写入或同时读取子程序的参数.这对安全编程非常有帮助,您最喜欢的Fortran资源将详细解释.

  • 如果我可以提出另一个建议 - 尝试"忘掉"使用非标准的真实*8和整数*4语法,它会限制灵活性.一种流行的方法是定义一个模块KINDS,它使用SELECTED_INT_KIND和SELECTED_REAL_KIND为你将要使用的类型声明一系列PARAMETER常量,例如SP和DP,然后使用REAL(DP)作为声明.我同意马克的观点,模块是你最好的选择. (5认同)