【问题标题】:Difference between intent(out) and intent(inout)意图(out)和意图(inout)之间的区别
【发布时间】:2015-04-20 00:06:42
【问题描述】:

根据 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)是一样的。

【问题讨论】:

  • 有趣的是,gfortran 和 ifort 都打印 5,尽管 ifort 警告说A dummy argument with an explicit INTENT(OUT) declaration is not given an explicit value
  • @Ross 你可能对重新标记是正确的,但是那里有很多类似的问题......如果你想做很多这样的编辑,最好等到你可以编辑而不审查。我经常把fortran90留在那里,即使添加通用标签以确保不会改变OP的意图。

标签: fortran


【解决方案1】:

intent(inout)intent(out) 肯定不一样。您已经注意到原因,尽管您没有得出正确的结论。在进入子程序时useless a 是未定义的,而不是已定义的。

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

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

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

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

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

如果在没有首先定义的情况下引用它们,则所有这些后面的东西都有可能产生非常尴尬的结果,比标量整数更严重。

【讨论】:

  • 有没有使用intent(inout)intent(out)显示不同输出的例子?
  • @Jack,这个问题是关于一个 invalid 程序的。如果您想要一个在使用intent(inout) 而不是intent(out) 时有所不同的有效 程序,那么您必须更加努力:使用intent(out) dummy 必须在过程中引用它该过程中的定义 - 这将覆盖可比较的intent(inout) dummy 的定义。但是,是的,一个有效的程序有可能给出不同的结果,只需将intent(inout) 更改为intent(out)反之亦然。评论无法表明这一点,所以如果您足够热心,请提出一个新问题。
  • 感谢您的回复!我正在四处寻找,看看是否有人问过/做过类似的事情。似乎没有。我会尽快发布一个问题。
  • 已发布后续问题:stackoverflow.com/q/58735057
猜你喜欢
  • 2019-06-22
  • 1970-01-01
  • 2011-02-22
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多