在Fortran子例程中分配数组

时间:2013-08-02 10:41:38

标签: memory-management fortran 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

该程序给出了以下错误:

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

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

感谢。

1 个答案:

答案 0 :(得分:9)

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

end

包含声明

的行
contains

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

的行
end program

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

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

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

至少还有一个其他选择,但对于初学者来说,它是没有吸引力的,我不会在这里提及。

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