我已经下载了 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/

10-13 09:53