在Fortran子程序中进行阵列分配

问题描述 投票:0回答:2

我的问题是关于Fortran中的数组分配。

我有一个子程序,比如说 readParams我想从文件中读取一些动态大小的数组。这些数组也是在子程序之外使用的。什么是处理这个问题的最好方法?

在F95中,似乎不可能在子程序中进行分配,然后将充满值的数组传回主程序。但如果我在主程序中分配,并在子程序中使用 "intent(inout)",它也会在那里被deallocated。

(我这里用的是F9095,但由于代码不大,我也可以修改成一个新的版本......) 我对Fortran相当陌生,所以我不确定数组处理的改进是否值得投入时间^^。

编辑 谢谢你的提示。我不是想 重新分配 我的数组在一个子程序中。

问题是:我有一个数组,我需要分配给它 某处 在我 程序。数组大小只有在我从子程序 readArgs. 因此我将数组设为 "可分配"。一旦分配,这个状态就不能再改变。在一个子程序中,数组中的值被填入了 readParams.我是否把它分配在最好的 或在 readParams 又是怎样的?

... 我现在把我的子程序放在一个模块中,然后在那里使用它们。目前我在一个模块中进行分配。,将数组传递给我的子程序,并且已经删除了子程序中数组声明中的 "allocatable "语句。"这似乎是可行的,但我仍然不明白这是否是一种方法。"。

arrays fortran dynamic-memory-allocation fortran90
2个回答
1
投票

在我看来,这个问题完全是重复的。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

不管你怎么做,两种方法都完全可以。


0
投票

如果还有人感兴趣的话,我用的是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  
© www.soinside.com 2019 - 2024. All rights reserved.