Проверка массивов нулевого размера и границ массивов - PullRequest
5 голосов
/ 12 апреля 2011

При компиляции с 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 Ответ

4 голосов
/ 12 апреля 2011

Это не создает проблем с компилятором fortran для Intel с -check bounds; и IBM XLF, который, по моему опыту, очень строг, также не жаловался с -qcheck.

Но в более широком смысле, да, не существует стандарта в отношении того, что проверка границ должна или не должна делать. Я, конечно, могу понять, почему некоторые компиляторы будут отмечать присвоение массиву нулевой длины как плохое / неправильное / странное; это странный случай.

...