spa*_*923 1 fortran gfortran allocatable-array g95
当从使用g95编译器转换到gfortran时,当我尝试编译之前已经工作的代码时出现以下错误
Error: Allocatable array ' ' at (1) must have a deferred shape
Run Code Online (Sandbox Code Playgroud)
这发生在我所有可分配数组的所有子程序中.一个例子如下.
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))
Run Code Online (Sandbox Code Playgroud)
如何使用gfortran编译此代码?
Fortran 2003(以及我认为,90,95和2008)标准规定,dimension()
可分配数组的声明中子句括号内的表达式必须是a deferred-shape-spec-list
,并且a deferred-shape-spec-list
是冒号列表,,
如果有,则由是列表中的多个元素.数组中的每个维度都应该有一个冒号.
我建议你替换如
integer, allocatable, dimension(1:,1:), INTENT(OUT)::inpoel
Run Code Online (Sandbox Code Playgroud)
有这样的陈述
integer, allocatable, dimension(:,:), INTENT(OUT)::inpoel
Run Code Online (Sandbox Code Playgroud)
稍后分配此数组时,默认情况下,每个维度的下限将是1
.另一方面,如果你想用非默认边界分配它,你可能会写
allocate(inpoel(3:12,4:14))
Run Code Online (Sandbox Code Playgroud)
显然,用你想要的任何值替换那些常数.
一个Fortran编译器可接受的代码不被另一个编译器接受,这并不奇怪.