Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Fortran procecdue中将非连续参数传递给连续伪数组_Fortran_Contiguous_Fujitsu Fortran - Fatal编程技术网

在Fortran procecdue中将非连续参数传递给连续伪数组

在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

最近,我在处理一个子例程时遇到了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规范(5.3.7)使用
    continuous
    属性表示假定形状伪参数:

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

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

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

    可以看出,一个限制主程序的有效参数(在本例中为
    t(2,1:4:2)
    ),另一个不限制

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


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