【发布时间】:2019-01-24 23:18:21
【问题描述】:
我正在尝试使用 gfortran 在 Mac 上编译相当现代的 fortran 代码。像这样的线条...
allocate(sce, mold=sct)
得到这样的错误:
Error: Array specification or array-valued SOURCE= expression required in ALLOCATE statement
看来,gfortran 理解 SOURCE 但不理解 MOLD。但是,我的 gfortran 是最近的:
gcc version 8.2.0 (MacPorts gcc8 8.2.0_3)
我看到网页声称 gfortran 从版本 7.something 开始就能够支持MOLD。所以肯定它应该能够用 8.2.0 做到这一点。这不是真的吗? Mac版有什么好笑的吗?谁能提出其他问题可能是什么?
编辑:如果有人还在,这个玩具代码可以正常工作:
program awm
integer, dimension(:), allocatable :: sct,sce
integer :: nspec = 100
allocate(sct(nspec))
allocate(sce, mold=sct)
end program
但是当 sct 和 sce 是派生类型时,它就分崩离析了:
program awm
type :: r1d
real, allocatable :: a(:)
end type
type(r1d), dimension(:), allocatable :: sct,sce
integer :: nspec = 100
allocate(sct(nspec))
do i = 1,nspec
allocate(sct(i)%a(10))
enddo
allocate(sce, mold=sct)
end program
这将返回我在上面遇到的错误。您可能会认为派生类型的定义有点奇怪,甚至是不必要的。好吧,从中获取的原始代码不是我的代码,我无法对其进行太多更改,实际上,由于我没有时间讨论的原因,这种结构确实有其用途。谢谢。
【问题讨论】:
-
这不是关于 supooting 模具,而是关于缺少阵列规格。这是一个已知的错误,但现在应该修复gcc.gnu.org/bugzilla/show_bug.cgi?id=44672
-
我写的测试程序或this related question 的测试程序都看不到问题(在Linux 上使用7.3)。因此,请提供一个完整的示例(可能是代码中存在问题)供我们进一步探索。 (然后添加标签 fortran 也是值得的。)
-
您的代码(带有明显必要的扩展)在 GCC 6 和 7 中编译正常,它会在 GCC 5 中导致上述错误。在 Linux 上测试。
-
GCC 8 也可以编译。
-
@VladimirF 但是 AFAICT,我自己在这里有 GCC 8。那么,不知何故,我拥有的版本有什么问题/过时吗?您是否偶然在 Mac 上进行测试?谢谢。
标签: macos gfortran allocation