Проверка массивов нулевого размера и границ массивов
При компиляции с GNU Fortran (v4.4.3) или Sun Studio F95 (v8.3) без проверки границ массива следующая программа запускается без ошибок. Однако, когда проверка границ массива включена (gfortran -fbounds-check
а также f95 -C
соответственно) скомпилированный исполняемый файл GNU снова запускается без ошибок, тогда как скомпилированный исполняемый файл Sun Studio дает ошибку времени выполнения,
****** FORTRAN RUN-TIME SYSTEM ******
Subscript out of range. Location: line 44 column 20 of 'nosize.f90'
Subscript number 2 has value 1 in array 't$27'
Это ошибка в вызове sub2()
, который использует автоматический аргумент массива для фиктивного x
, sub1()
вызовы работают нормально с любым компилятором и любыми флагами.
Насколько мне известно, эта программа "легальна" в том смысле, что на массив нулевого размера можно ссылаться как на массив ненулевого размера, и нет явного индексирования измерения нулевой длины x
, Но есть ли здесь какая-то нарезка массива нулевого размера или автоматическая тонкость массива, которую мне здесь не хватает? И следует ли ожидать, что проверка границ массивов будет вести себя одинаково в разных компиляторах, или мне следует рассматривать это расширение для конкретного поставщика?
MODULE subs
IMPLICIT NONE
CONTAINS
SUBROUTINE sub1(x)
IMPLICIT NONE
REAL :: x(:,:)
PRINT*,'------------------------------------'
PRINT*,SHAPE(x)
PRINT*,SIZE(x)
END SUBROUTINE sub1
SUBROUTINE sub2(n1,n3,x)
IMPLICIT NONE
INTEGER,INTENT(in) :: n1, n3
REAL :: x(n1,n3)
PRINT*,'------------------------------------'
PRINT*,SHAPE(x)
PRINT*,SIZE(x)
END SUBROUTINE sub2
END MODULE subs
PROGRAM nosize
USE subs
IMPLICIT NONE
INTEGER :: n1 = 2, n2 = 2, n3 = 0
REAL,ALLOCATABLE :: x(:,:,:)
ALLOCATE(x(n1,n2,n3))
x(:,:,:) = -99.9
PRINT*,'ALLOCATED? ',ALLOCATED(x)
PRINT*,'SHAPE =',SHAPE(x)
PRINT*,'SIZE =',SIZE(x)
PRINT*,'X =',x
CALL sub1(x(:,1,:))
CALL sub2(n1,n3,x(:,1,:))
END PROGRAM nosize
1 ответ
Это не создает проблем с компилятором fortran для Intel с -check bounds; и IBM XLF, который, по моему опыту, очень строг, также не жаловался с -qcheck.
Но в более широком смысле, да, нет стандарта в отношении того, что проверка границ должна или не должна делать. Я, конечно, могу понять, почему некоторые компиляторы отмечают присвоение массиву нулевой длины как плохое / неправильное / странное; это странный случай.