"Выделяемый массив должен иметь отложенную форму" при переходе от g95 к gfortran
При переходе от использования компилятора 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 ответ
Стандарт 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))
очевидно, заменив эти константы любыми значениями, которые вы пожелаете.
Не удивительно, что код, приемлемый для одного компилятора Фортрана, не приемлем для другого.