Fortran 95 - 在模块之间传输阵列

时间:2013-07-02 10:25:34

标签: arrays fortran fortran95

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

工作原理:  要求用户输入一个整数' 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 

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

在函数将其返回到主程序之前,您要释放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)

后立即调用它

答案 1 :(得分:3)

@Kyle的回答指出导致程序崩溃的问题。但是你应该知道你的代码还有另一个微妙的问题,尽管它不是一个彻头彻尾的错误。

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

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