Fortran:将相同的数组作为两个伪参数传递给子例程
问题描述:
假设我有一个接受两个数组作为输入的子例程。一个给予意图(in),另一个给予意图(out)。后者是以任意方式从前者衍生而来的。但是,如果我通过两个虚拟参数的相同实际参数会怎样?一般来说,结果不会是子程序的意图。查看下面的代码片段。Fortran:将相同的数组作为两个伪参数传递给子例程
问题是,编译器似乎并不在乎,即使我已经给出了意图标志。我正在使用英特尔Visual Fortran Composer 12和所有诊断程序。有没有更好的方法来编写子程序,或者我缺少一些编译器选项,以使代码更安全?
module foo
contains
subroutine sub_a()
implicit none
real::array(10,10)
call sub_b(array,array)
end subroutine
subroutine sub_b(array1,array2)
implicit none
real,intent(in)::array1(10,10)
real,intent(out)::array2(10,10)
!array2 is derived from array1 somehow
end subroutine
end module foo
答
这被称为别名 - 通过两个不同的名称引用相同的项目。在大多数情况下,这在Fortran中是不允许的。您的示例不是合法的Fortran - 请参见http://software.intel.com/en-us/blogs/2009/07/10/doctor-fortran-in-ive-come-here-for-an-argument-side-2/(具有此特定情况),它通过用于两个伪参数的相同实际参数进行别名。 Fortran编译器不需要诊断所有违反语言规则的行为,这似乎是编译器无法识别的示例。
编辑:允许别名。被禁止的是通过别名来改变伪参数的值,这里是另一个伪参数。规则对指针和目标参数的限制较少。具体规则在Adams等人的“The Fortran 2003 Handbook”中有描述。
答
把周围那就是意图(中)参数括号使代码合法的,因为你正在有效地传递一个副本:
call sub_b((array),array)
谢谢,清除它。不幸的是,英特尔Visual Fortran对此没有提出警告。我想唯一的解决方案是使用适当的子程序调用的纪律。 – bdforbes
您如何比较两个输入数组的位置?这是一件安全的事情吗?另外,显然F2003没有实现loc函数,是否有等价的? – bdforbes