0

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

谢谢你们的帮助!

4

2 回答 2

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)

于 2013-07-02T10:42:54.317 回答
3

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

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

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

于 2013-07-02T10:54:27.383 回答