3

contiguous最近,我在处理具有带有属性的虚拟数组的子例程时遇到了 Fujitsu Fortran 2.0.0 版的意外行为。

我已将问题简化为一个简单的示例,如下所示:

program test
  INTEGER, DIMENSION(:,:), ALLOCATABLE :: t
  INTEGER :: i, j
  ALLOCATE(t(3,3))
  DO i = 1, 4
   DO j = 1, 4
     t(i,j) = i*j
     !!PRINT *, t(i,j)
   END DO
  END DO
  CALL fun(t(2,1:4:2))
  DEALLOCATE(t)

  CONTAINS
    SUBROUTINE fun(arg)
      ! Contiguous dummy argument arg
      INTEGER, CONTIGUOUS :: arg(:)
      PRINT *, arg(2)
    END SUBROUTINE
end program test

这段代码可以由 gfortran (GNU Fortran (GCC) 6.3.0) 成功编译,但在使用 Fujitsu Fortran 编译器(如上所述)的集群上失败,并给出以下错误代码:

"test_contiguous.f90", line 13: The actual argument number 1 of procedure 'fun' corresponding to a dummy argument 'arg' with the CONTIGUOUS attribute must be contiguous.

我很困惑,因为据我了解编译器应该在子例程的入口处创建一个连续的临时文件(例如这里所示:Fortran 2008 contiguous

其实我有两个问题:

  1. 这种情况的规范是什么?
  2. 它可以成为编译器强制他为这种情况创建一个连续临时的标志吗?

我正在尝试构建第三方软件,并且无法根据需要更改源。

4

1 回答 1

5

contiguousFortran 2008 规范说 (5.3.7) 具有以下属性的假定形状虚拟参数:

CONTIGUOUS 属性指定假定形状数组只能是与连续有效参数相关联的参数,或者数组指针只能是与连续目标相关联的指针。

另一方面,Fortran 2018 规范说 (8.5.7):

CONTIGUOUS 属性指定假定形状数组是连续的,数组指针只能是与连续目标相关联的指针,或者假定秩伪数据对象是连续的。

可以看出,一个限制了有效参数(在这种情况下t(2,1:4:2)是主程序),另一个没有。

但是应该注意的是,这里的限制是对程序的限制,编译器不需要检测/强制执行。即使在 Fortran 2008 模式下,编译器也可以自由接受、制作临时副本、非连续参数。在这两种情况下,编译器都不能制作临时副本。


至于一个特定的编译器是否有放宽其假设的选项,在这种情况下我不能说:我无法访问这个来测试。我很高兴有人在这个答案中进行编辑,应该找到这样的选项。

于 2017-12-17T08:40:17.697 回答