当从使用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编译此代码?
答案 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编译器可接受的代码对另一个编译器不可接受,这并不奇怪。