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)
这是构建这种程序的正确方法吗?如果是这样,我该如何解决错误?
谢谢.
假设您有一个包含程序和子例程的源文件,正如您的帖子建议的那样,最简单的解决方法是替换包含该语句的行
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资源将详细解释.
| 归档时间: |
|
| 查看次数: |
5629 次 |
| 最近记录: |