Проверка массивов нулевого размера и границ массивов

При компиляции с 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.

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

Другие вопросы по тегам