Fortran 95—在模块之间传输数组



在模块和主程序之间传输数组时遇到问题。该模块和主程序使用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 

谢谢你们的帮助!

在函数将function1数组返回到主程序之前,您正在释放它。去掉deallocate(function1)线,它就能完美工作。

如果你想要一个正方形矩阵的输出,那就不太完美了。您应该将书面声明作为

  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) 后立即调用它

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

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

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

最新更新