我需要从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
这是构造此类程序的正确方法吗?如果是这样,我该如何解决错误?
谢谢。
假设您有一个包含程序和子例程的单个源文件(如您的帖子所述),最简单的解决方法是替换包含该语句的行
end
一行包含该语句
contains
在源文件的末尾写一行包含该语句的行
end program
(是的,关键字program
不是必需的,但很有用。)
编译器报告的问题是,在对代码进行结构化时,该程序对子例程的接口一无所知memory
,该接口在Fortran中是隐式的。当您要调用子例程并传入或传出可分配数组时,该子例程必须具有显式接口。
提供显式接口有几种方法。正如我已经向您展示的,一种方法是在程序中包含该子例程。当您的程序变得更大一点时,另一种更有用的方法是在模块中编写子例程,并将其与要使用它们的程序相关联。阅读Fortran教程中涉及module
s和该use
语句的部分。
至少还有其他选择,但是它特别是对于初学者来说,没有吸引力,我这里不再赘述。
并且,在撰写本文时,请学习并使用关键字intent
指定是将对子例程的参数进行读取,写入还是将二者都指定。这对安全编程有很大帮助,您最喜欢的Fortran资源将进行详细说明。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句