在Fortran程序中将非连续参数传递给连续的虚拟数组

时间:2017-12-17 06:07:23

标签: fortran contiguous fujitsu-fortran

最近,我遇到了富士通Fortran版本2.0.0的意外行为,同时处理了一个子程序,该子程序具有contiguous属性的虚拟数组。

我已将问题简化为一个简单的例子:

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. 它可以成为编译器的标志,迫使他为这种情况创建一个连续的临时文件吗?
  3. 我正在尝试构建第三方软件,但无法根据需要更改源代码。

1 个答案:

答案 0 :(得分:3)

Fortran 2008规范说明(5.3.7)具有contiguous属性的假定形状伪参数:

  

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

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

  

CONTIGUOUS属性指定假定形状数组是连续的,数组指针只能是与连续目标关联的指针,或假定等级虚拟数据对象是连续的。

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

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

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