我的问题是关于Fortran中的数组分配。
我有一个子程序,比如说 readParams我想从文件中读取一些动态大小的数组。这些数组也是在子程序之外使用的。什么是处理这个问题的最好方法?
在F95中,似乎不可能在子程序中进行分配,然后将充满值的数组传回主程序。但如果我在主程序中分配,并在子程序中使用 "intent(inout)",它也会在那里被deallocated。
(我这里用的是F9095,但由于代码不大,我也可以修改成一个新的版本......) 我对Fortran相当陌生,所以我不确定数组处理的改进是否值得投入时间^^。
编辑 谢谢你的提示。我不是想 重新分配 我的数组在一个子程序中。
问题是:我有一个数组,我需要分配给它 某处 在我 主 程序。数组大小只有在我从子程序 readArgs. 因此我将数组设为 "可分配"。一旦分配,这个状态就不能再改变。在一个子程序中,数组中的值被填入了 readParams.我是否把它分配在最好的 主 或在 readParams 又是怎样的?
... 我现在把我的子程序放在一个模块中,然后在那里使用它们。目前我在一个模块中进行分配。主,将数组传递给我的子程序,并且已经删除了子程序中数组声明中的 "allocatable "语句。"这似乎是可行的,但我仍然不明白这是否是一种方法。"。
在我看来,这个问题完全是重复的。Fortran子程序的输入参数是否可以在子程序的主体中进行重定位和分配? 如果不可以,那么应该将其关闭。因为你没有显示任何代码,所以我们怎么能告诉你你的代码(工作)是否正确?
但是我一个人的意见和很多人的意见不一样,所以如果你的代码看起来和这个类似,可能就是正确的。
你可以在一个子程序中读取大小,然后在主程序中进行分配
module subs
contains
subroutine readArgs(n)
integer, intent(out) :: n
!read n here
end subroutine
subroutine readParams(a)
real :: a(:)
do i = 1, size(a)
!read values of a
a(i) =
end do
end subroutine
end module
program main
use subs
integer :: n
readArgs(n)
allocate(a(n))
readParams(n)
end program
或者你可以在子程序中分配它。你必须满足以下所有要求 Fortran子程序的输入参数是否可以在子程序的主体中进行deallocated和分配?
module subs
contains
subroutine readArgs(n)
integer, intent(out) :: n
!read n here
end subroutine
subroutine readParams(n, a)
real, allocatable :: a(:)
allocate(a(n))
do i = 1, size(a)
!read values of a
a(i) =
end do
end subroutine
end module
program main
use subs
integer :: n
readArgs(n)
readParams(n)
end program
不管你怎么做,两种方法都完全可以。
如果还有人感兴趣的话,我用的是Cuda编译器pgf90,以下是工作原理。
module subs
implicit none
contains
subroutine load_array( b )
real, allocatable :: b(:)
allocate( b(10) )
b( 7 ) = 4
end subroutine load_array
end module subs
Program main
use subs
implicit none
real, allocatable :: a(:)
Call load_array( a )
print *, a(7)
deallocate( a )
end program main