我已经下载了 Fortran 90/95 自适应网格细化库 (Paramesh),现在我正在尝试编译它附带的示例程序。在这个过程中,我修改了 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
这导致 this 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 处理器的诊断,则不会被接受。如果可移植性是您的目标,则不要使用此类功能。以前版本的 Intel Fortran 缺少诊断可能是一个疏忽。
需要由变量指定其大小的模块数组应该是可分配的,在使用模块正确提供的操作之前,在“初始化”过程或类似过程中分配数组。
关于arrays - 英特尔 Fortran 95 编译器是否允许模块数组的大小不固定?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31256569/