在Fortran procecdue中将非连续参数传递给连续伪数组
最近,我在处理一个子例程时遇到了Fujitsu Fortran 2.0.0版的意外行为,该子例程具有在Fortran procecdue中将非连续参数传递给连续伪数组,fortran,contiguous,fujitsu-fortran,Fortran,Contiguous,Fujitsu Fortran,最近,我在处理一个子例程时遇到了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) EN
连续属性的伪数组
我已将问题简化为一个简单的示例,如下所示:
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规范(5.3.7)使用continuous
属性表示假定形状伪参数:
“连续”属性指定假定形状数组只能是与连续有效参数关联的参数,或者数组指针只能是与连续目标关联的指针
另一方面,Fortran 2018规范规定(8.5.7):
连续属性指定假定的形状数组是连续的,数组指针只能是与连续目标关联的指针,或者假定的秩伪数据对象是连续的
可以看出,一个限制主程序的有效参数(在本例中为t(2,1:4:2)
),另一个不限制
但是,应该注意,这里的限制是对程序的限制,编译器不需要检测/执行该程序。即使在Fortran 2008模式下,编译器也可以自由地接受一个非连续参数,并创建一个临时副本。在这两种情况下,编译器都不能创建临时副本
至于一个特定的编译器是否有放松其假设的选项,在这种情况下,我不能说:我无法访问这个编译器进行测试。我很高兴有人编辑到这个答案这样的一个选项应该找到