Iva*_*nko 3 fortran contiguous fujitsu-fortran
最近,我在处理具有该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
Run Code Online (Sandbox Code Playgroud)
这段代码可以通过 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.
Run Code Online (Sandbox Code Playgroud)
我很困惑,因为据我所知,编译器应该在子例程的入口处创建一个连续的临时文件(如下所示:Fortran 2008 contiguous)
其实我有两个问题:
我正在尝试构建第三方软件,但无法根据需要更改源代码。
Fortran 2008 规范说 (5.3.7) 具有以下contiguous属性的假定形状虚拟参数:
CONTIGUOUS 属性指定假定形状数组只能是与连续有效参数关联的参数,或者数组指针只能是与连续目标关联的指针。
另一方面,Fortran 2018 规范说 (8.5.7):
CONTIGUOUS 属性指定假定形状数组是连续的,数组指针只能是与连续目标相关联的指针,或者假定等级虚拟数据对象是连续的。
可以看出,一个限制了有效参数(在这种情况下t(2,1:4:2)是主程序),另一个没有。
但是,应该注意的是,这里的限制是对编译器不需要检测/强制执行的程序的限制。即使在 Fortran 2008 模式下,编译器也可以自由接受(制作临时副本)非连续参数。在两种情况下必须编译器创建一个临时副本。
至于特定的编译器是否有选项可以放宽其假设,在这种情况下我不能说:我无法访问这个进行测试。我很高兴有人编辑这个答案,应该找到这样一个选项。
| 归档时间: |
|
| 查看次数: |
535 次 |
| 最近记录: |