意图(out)和意图(inout)之间的区别

时间:2015-04-20 00:06:43

标签: fortran

根据Fortran标准:

  

非指针伪参数的INTENT(OUT)属性指定在调用过程时未定义伪参数

但是这个简单的代码给了我5作为输出,所以看起来参数在程序开始时没有被定义(在这种情况下是子程序)。

subroutine useless(a)
  integer, intent(out) :: a
  print *,a
end subroutine useless

program test
  integer :: n=5
  call useless(n)
end program test

我错了什么?似乎intent(inout)intent(out)是相同的。

1 个答案:

答案 0 :(得分:10)

intent(inout)intent(out)肯定不一样。你已经注意到了为什么,虽然你没有得出正确的结论。在进入子例程useless a时,未定义,而不是定义。

变量“undefined”意味着在引用变量时不能依赖于特定的行为。您发现变量a的值为5,但这并不意味着您可以观察到的唯一值是5。特别是“未定义”并不意味着“采用像NaN这样的特定值”。

由于对未定义变量的引用,您的代码不符合标准。请参阅Fortran 2008 6.2(类似的含义将在最初标记的Fortran 90中的某处)。特别值得注意的是编译器不必指出你的错误。

使用intent(inout)时,变量a将在引用时定义,并且保证其值5(对于符合标准的处理器)。

更广泛地说,两个意图属性之间存在其他差异,而变量a定义的相似性的这种“巧合”外观可能更加麻烦。

例如,可以释放具有延迟类型参数的可分配数组和对象;派生类型变为未定义(并且任何可分配的组件被释放)和具有默认初始化的组件被“重新初始化”;指针的关联状态变得不明确。

所有这些后面的东西都有可能产生非常尴尬的结果,比使用标量整数更有可能,如果它们被引用而没有先被定义。