【发布时间】:2020-12-12 14:29:45
【问题描述】:
让我先说我对 Fortran 非常陌生,但对 Python 很熟悉。然而,我的研究项目需要我使用一些预先编写的 Fortran 代码,这些代码目前无法在我的电脑上编译。我正在尝试了解原因。
我正在尝试编译的实际代码很长,可能不是很有启发性,但我想我已经设法提出了一个我认为问题所在的最小示例。假设我有一个非常简单的模块和子程序如下,
module arraycheck
implicit none
real*8, allocatable, dimension(:) :: x
contains
subroutine fillx
real*8, allocatable, dimension(:) :: x
allocate(x(5))
x(1) = 1
x(2) = 2
x(3) = 3
x(4) = 4
x(5) = 5
print*, x
end subroutine fillx
end module arraycheck
我希望简单地创建一个数组x,当子例程fillx 被调用时,它会用整数1 到5 填充数组。我的实际源包含一些概念上与此类似的东西。现在我还有一个main程序如下,
program main
use arraycheck
print*, x
call fillx
print*,x
end
我的想法是,在第一个print 语句中,变量x 仍然未分配,所以print 什么也不返回,然后在第二个print 语句中x 已被填充,所以它应该返回填充的数组。
但是,在两个 print 语句中都没有返回任何内容。现在在我的原始源代码中发生了类似的事情,这导致运行时抛出一个错误,即未分配的数组作为实际参数传递到某处,而该参数应该已分配。似乎与我在此处的小示例中发生的情况完全相同。
所以我的问题是,我在此处的示例中观察到的行为是预期的吗?如果是,我如何更改代码以使其以我希望的方式工作?如果我知道这一点,我可能会更好地理解为什么实际来源不起作用。
以防万一,我在 ubuntu 上使用 gfortran。
谢谢!
【问题讨论】:
标签: fortran gfortran subroutine