我已经下载了 Fortran 90/95 自适应网格细化库(Paramesh http://www.physics.drexel.edu/~olson/paramesh-doc/Users_manual/amr.html),现在我正在尝试编译一个附带的示例程序。在此过程中,我修改了 Makefile 以使用 gfortran 而不是 Intel Fortran 编译器。
在库代码中,有一个包含以下代码片段的模块:
module physicaldata
! Many many lines of variable definitions here
!....
Public :: nfluxvar
Integer,Save :: nfluxvar
! Many many lines of variable definitions here
!....
end module physicaldata
其他地方有
module flux_assign
use physicaldata
integer :: iflux_target(nfluxvar)
end module flux_assign
这导致这个错误 https://stackoverflow.com/questions/14296787/fortran-95-array-must-have-constant-shape-error:
advance_soln_vdt.F90:16.40:
Included at amr_main_prog.F90:29:
integer :: iflux_target(nfluxvar)
1
Error: The module or main program array 'iflux_target' at (1) must have constant shape
如果使用其他编译器编译该代码可以工作吗?我知道对于标准 Fortran,或者至少是 gfortran 使用的 Fortran,要求用于表示数组大小的整数变量应该具有parameter
附加到它们的关键字。其他 Fortran 编译器不也是这样吗?其他编译器是否包含此类非标准功能?
当前的 Intel Fortran 会针对此代码发出错误。
标准语言要求在模块(或主程序或块数据或子模块,以及在其他一些地方使用的数组)的规范部分中声明的不可分配、非指针数组必须具有常量数组边界。
iflux_target
就是这样一个数组。
具有此类数组的程序是不合格的,并且在没有经过符合标准的 Fortran 处理器诊断的情况下不会被接受。如果可移植性是您的目标,那么不要使用此类功能。以前版本的英特尔 Fortran 缺乏诊断可能是一个疏忽。
需要由变量指定大小的模块数组应该是可分配的,在使用模块提供的正确操作之前,在“初始化”过程或类似过程中分配数组。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)