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)
其实我有两个问题:
- 这种情况的规范是什么?
- 它可以成为编译器强制他为这种情况创建一个连续临时的标志吗?
我正在尝试构建第三方软件,并且无法根据需要更改源。