【问题标题】:Fortran 95 - Transferring arrays between modulesFortran 95 - 在模块之间传输数组
【发布时间】:2013-07-02 10:25:34
【问题描述】:

我在模块和主程序之间传输数组时遇到问题。该模块和主程序使用 gfortran 编译得非常好。但是,在执行 .exe 文件时,windows 遇到了问题,必须关闭。这似乎只发生在数组大小未知(并且必须分配其大小)时。我已经包含了一小段代码来说明这个问题:

工作原理: 用户被要求输入一个整数“i”,它定义了方阵的大小。这个整数被传递给模块函数,该函数创建矩阵并将其返回给主程序。然后将矩阵打印到屏幕上。

一个文件中的主程序:

program main1
use module1
implicit none
integer :: i
real,allocatable :: a(:,:)

write(*,*)'Input the size of the square matrix'
read(*,*)i

allocate(a(i,i))
a = function1(i)

write(*,*) 'The square matrix a='
write(*,*) a

deallocate(a)
end program main1

和模块在一个单独的文件中:

module module1

contains 
function function1(i)
real, allocatable,dimension(:,:) :: function1
integer :: i  

allocate(function1(i,i))
function1 = 1.0

deallocate(function1)
end function function1
end module 

感谢你们的帮助!

【问题讨论】:

    标签: arrays fortran fortran95


    【解决方案1】:

    在函数将其返回到主程序之前,您正在释放您的 function1 数组。去掉deallocate(function1) 行,它就可以完美运行了。

    好吧,如果你想要一个方阵输出,那不是很完美。您应该将 write 语句设置为

      do j=1,i
         write(*,*) a(:,j)
      enddo
    

    输出类似于

      1.000  1.000  1.000
      1.000  1.000  1.000
      1.000  1.000  1.000
    

    请注意,如果您担心function1 占用内存空间,请编写一个释放它的子程序,并在设置a=function1(i) 后立即调用它

    【讨论】:

    • 你最后一句没看懂,好像是在暗示function1里面分配的数组复制到a。我的理解是调用function1后,函数分配的数组是可以访问的,因为变量afunction1不会占用额外的内存。
    • 我认为因为他在那里分配了一个数组,所以这样做需要内存。那么,我想,情况并非如此?
    • 据我(以及迄今为止的另一个人!)了解情况,该函数将内存分配返回给调用分配的内存a 的调用例程。只有一个内存分配。
    • 我现在明白了。很高兴知道未来。谢谢!
    • 对于发布的代码(忽略错误的解除分配)有两个分配 - 每个分配语句一个。当包含函数引用的赋值语句完成时(即“在执行包含引用的最里面的可执行结构之后”),函数结果的分配会自动解除分配。赋值“正确”只是将值从函数结果复制到 a。编译器可能在幕后很聪明地避免了无意义的内存操作,但是对于符合标准的程序的可观察结果必须“好像”这种行为。
    【解决方案2】:

    @Kyle 的回答指出了导致程序崩溃的问题。但是您应该注意您的代码中的另一个微妙问题,尽管它不是一个彻底的错误。

    如果您有一个最新的编译器,并且设置了正确的选项,那么调用代码中的分配语句是不必要的。也就是说,您不需要在调用function1 之前分配变量a,Fortran 将自动将a 分配给function1 返回的任何大小。编译器选项当然取决于您使用的编译器。您可能需要使用 Fortran 2003 语义或自动分配 lhs 变量或类似的东西。

    这是一个您应该注意的问题,因为如果您确实使用自动分配(或者如果您的编译器默认实现它),将调用结果分配给 function1a 将重新分配 @ 987654327@.

    【讨论】:

    • 你是绝对正确的,因为 allocate 语句是多余的,但 re 分配仅在 lhs 的大小(或延迟长度参数或动态类型,适当时)时发生不匹配。否则你可以破解 F95 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多