我需要从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
这是构建此类程序的正确方法吗?如果是这样,我该如何解决错误?
感谢。
答案 0 :(得分:9)
假设您有一个包含程序和子例程的源文件,正如您的帖子所建议的那样,最简单的解决方法是替换包含该语句的行
end
包含声明
的行contains
并在源文件的末尾写入包含语句
的行end program
(是的,关键字program
不是必需的,但它很有用。)
您的编译器报告的问题是,由于您已经构建了代码,程序对子例程memory
的接口一无所知,该接口在Fortran术语中是隐式的。如果要调用子例程并传入或传出可分配的数组,子例程必须具有显式接口。
有几种方法可以提供显式接口。正如我已经向您展示的那样,一个是在程序中包含子程序。当程序变得更大时,另一种更有用的方法是在模块中编写子程序,并在想要使用它们的程序中使用它们。阅读Fortran教程中涵盖module
和use
语句的部分。
至少还有一个其他选择,但对于初学者来说,它是没有吸引力的,我不会在这里提及。
而且,在我写作的时候,了解并使用关键字intent
来指定是否将读取,写入或同时读取子程序的参数。这对安全编程非常有帮助,您最喜欢的Fortran资源将详细解释。