4

我需要从 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

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

谢谢。

4

1 回答 1

9

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

end

带有包含语句的行

contains

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

end program

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

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

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

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

而且,在我写作的时候,学习并使用关键字intent来指定子例程的参数是被读取、写入还是两者兼而有之。这对安全编程很有帮助,你最喜欢的 Fortran 资源会详细解释。

于 2013-08-02T10:54:30.113 回答