Intel Fortran value attribute

3

如果我问了一个非常愚蠢的问题,我很抱歉;我的Fortran不是很好。我正在移植一些旧的Fortran代码,并遇到了这个子程序定义:

SUBROUTINE SET_HYDROMODULE(HYDROMODULE)
IMPLICIT NONE
INTEGER*4 HYDROMODULE [VALUE]
...
END

Intel Fortran 毫不费力地通过了此操作,但启用非标准语言特性的警告时它会发出以下警告:

warning #7009: Attribute syntax is not standard F95

gfortran认为它是对共存数组规范的一种尝试,但它并不是有效的规范。

有人能告诉我[VALUE]子句的意思吗?

编辑 它是指定按值传递的非标准方式吗?它是否等同于这个:

INTEGER*4, VALUE :: HYDROMODULE

我在c语言互操作代码中经常看到这种情况,这表明了这一点。


2
我认为,但我的记忆太模糊了,我不确定我能正确地回答这个问题,[VALUE]是DEC Fortran的遗留物之一,它是Intel Fortran的祖先之一,并实现了许多扩展到其当时标准FORTRAN(或Fortran)中。我不确定它的意思是否与Fortran 2003标准的VALUE属性完全相同,也不确定它是否不同。有人应该在互联网上搜索解释。或者等待Steve Lionel醒来并做出贡献。 - High Performance Mark
1个回答

1
"

VALUE属性是在Fortran 2003中添加的,因此它不能与Fortran 95一起使用并不奇怪。Fortran标准(2008年版)在第5.3.18节“VALUE属性”中进行了规定。根据我所读的内容,需要将其指定为

"
INTEGER*4, VALUE :: HYDROMODULE

标准中的第5.4.16节定义了第二种形式,即VALUE语句:

INTEGER*4 :: HYDROMODULE
VALUE     :: HYDROMODULE

你提供的另一种形式似乎是英特尔的扩展。gfortran 支持VALUE属性(至少在4.9版本中)。
快速搜索显示,除了确保互操作性外,VALUE属性确实可以用于强制某种按值调用,来自这里

当指定此属性时,效果就像实际参数被分配给临时变量,而临时变量是与虚拟参数相关联的参数。确定发生这种情况的实际机制由处理器确定。


2
但是你最后的“旁注”方法和一个带有VALUE参数的虚拟参数之间有一个非常重要的区别 - 一个实际的参数表达式不能被过程修改,而VALUE虚拟参数可以。鉴于Fortran中VALUE的用例,这种差异是实质性的。 - IanH
@IanH 这是真的 - 这就是为什么我只把它作为一个附注添加的原因。这是一种可能适用的简化方法。 - Alexander Vogt
它也不会改变调用约定! - IanH
好的...我已经移除了旁注。 - Alexander Vogt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接