【问题标题】:Allocate matrix in subroutine fortran在子程序 fortran 中分配矩阵
【发布时间】:2014-10-11 18:30:54
【问题描述】:

我是 Fortran 新手(在 C 方面更有经验),我正在尝试使用 allocate 命令为值矩阵分配内存。代码是:

module SMS
contains
    subroutine readSMS(elem)

    real, dimension(:,:), allocatable :: elem

    allocate( elem(3792, 3) ) ! this will be a variable later on, for now I've
                              ! hard-coded the number of elements in my test case
    end subroutine
end module

运行时,代码总是在allocate 行崩溃,并出现错误:Program exception - access violation。但是,如果elem 是一个局部变量而不是传递给子例程的局部变量,则该程序可以正常工作。在 C 中,我会使用类似的东西:

double **elem;

readSMS(&elem); //pass in a pointer to elem so that memory can be allocated

在 Fortran 中是否有类似的方法可以用来在子例程中分配内存?

这是对函数的调用:

program main

use SMS
implicit none

include 'mpif.h'
! Variables
integer ierr,num_procs,my_id
integer num_elem,num_regions
real, dimension(:,:), allocatable :: elem
real, dimension(:,:), allocatable :: regions

! Body of main
call MPI_INIT(ierr)

call MPI_COMM_RANK(MPI_COMM_WORLD,my_id,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,num_procs,ierr)

call readSMS(elem)

deallocate(elem)

call MPI_FINALIZE(ierr)

end program main

目前,这是整个程序(如您所见,我才刚刚开始)。

【问题讨论】:

  • 隔离代码没有任何问题(intent 会让我更开心)。我们需要查看调用代码(以及那里的声明)才能说得更多。
  • @francescalus:编辑添加调用代码和声明。
  • 您需要一个显式接口来使用可分配数组作为参数;最好是将子程序放在一个模块中。
  • 特别是 Jonathan Dursi 的链接,请注意对显式接口的要求。这似乎从主程序中丢失。

标签: fortran


【解决方案1】:

@francescalus 我认为子程序 readSMS 在模块中,所以显式接口不是问题。 @wolfPack88 查看@Jonathan 提供的链接,您将能够找出解决方案。

更新:

module SMS
contains
subroutine readSMS(elem)

real, dimension(:,:), allocatable :: elem

allocate( elem(10, 3) ) 
elem=10                 
end subroutine
end module

program main

use SMS
implicit none

real, dimension(:,:), allocatable :: elem

call readSMS(elem)
print *, elem

deallocate(elem)
end program main

此代码在 ifort 中运行没有任何问题...

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2014-09-06
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多