2011-08-22 81 views
5

假设我有一个接受两个数组作为输入的子例程。一个给予意图(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 

回答

7

这被称为别名 - 通过两个不同的名称引用相同的项目。在大多数情况下,这在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”中有描述。

+0

谢谢,清除它。不幸的是,英特尔Visual Fortran对此没有提出警告。我想唯一的解决方案是使用适当的子程序调用的纪律。 – bdforbes

+0

您如何比较两个输入数组的位置?这是一件安全的事情吗?另外,显然F2003没有实现loc函数,是否有等价的? – bdforbes

1

把周围那就是意图(中)参数括号使代码合法的,因为你正在有效地传递一个副本:

call sub_b((array),array) 
相关问题