当从g95移动到gfortran时,“可分配数组必须具有延迟形状”

时间:2013-05-20 17:01:41

标签: fortran gfortran allocatable-array g95

当从使用g95编译器转换到gfortran时,当我尝试编译之前已经有效的代码时,我收到以下错误

Error: Allocatable array ' ' at (1) must have a deferred shape

在我的所有可分配数组的所有子例程中都会发生这种情况。下面是一个例子。

    SUBROUTINE TEST(name,ndimn,ntype,nelem,npoin,nface,inpoel,coord,face)

    IMPLICIT  NONE

    integer:: i, j,testing
    integer, INTENT(OUT)::ndimn,ntype,nelem,npoin,nface
    integer, allocatable, dimension(1:,1:), INTENT(OUT)::inpoel
    real::time, dummy
    real, allocatable, dimension(1:,1:), INTENT(OUT)::coord
    integer, allocatable, dimension(1:,1:), INTENT(OUT)::face

    character(len=13)::name
    character(len=11)::name3

    name='testgrid.dat'
    name3='testgeo.dat'

    open (unit=14, file='testgrid2.dat', status='old')

    read(14,*)
    read(14,*)
    read(14,*)
    read(14,*) ndimn, ntype
    read(14,*)
    read(14,*) nelem, npoin, nface
    read(14,*)

    allocate(inpoel(ntype,nelem+1),coord(ndimn,npoin+1),face(ntype,nface+1))

如何使用gfortran编译此代码?

1 个答案:

答案 0 :(得分:5)

Fortran 2003(以及我认为,90,95和2008)标准规定,可分配数组的声明中dimension()子句的括号内的表达式必须是deferred-shape-spec-list并且deferred-shape-spec-list是冒号列表,如果列表中有多个元素,则由,分隔。对于数组中的每个维度,应该有一个冒号。

我建议您替换

等语句
integer, allocatable, dimension(1:,1:), INTENT(OUT)::inpoel

使用

等语句
integer, allocatable, dimension(:,:), INTENT(OUT)::inpoel

稍后分配此数组时,默认情况下,每个维度的下限为1。另一方面,如果你想用非默认边界分配它,你可以编写

allocate(inpoel(3:12,4:14))
显然,用你想要的任何值替换那些常量。

一个Fortran编译器可接受的代码对另一个编译器不可接受,这并不奇怪。