当前位置:  开发笔记 > 运维 > 正文

Fortran意图(inout)与省略意图

如何解决《Fortran意图(inout)与省略意图》经验,为你挑选了2个好方法。

良好实践规定Fortran中的子例程参数应该都具有指定的意图(即intent(in),intent(out)或者如此问题intent(inout)所描述的):

subroutine bar (a, b)
    real, intent(in) :: a
    real, intent(inout) :: b
    b = b + a
    ...

但是,未指定intent是有效的Fortran:

subroutine bar (a, b)
    real, intent(in) :: a
    real :: b
    b = b + a
    ...

在编译时检查指定intent(inout)的参数和没有指定意图的参数之间是否存在任何真正的差异?如果我正在改进对较旧的,无意图的代码的意图,我还有什么可担心的吗?



1> M. S. B...:

根据Adams等人的Fortran 2003手册,一个intent(inout)参数和没有指定intent的参数之间存在一个区别.在intent(inout)情况下的实际参数(即在调用者中)必须始终是可定义的.如果未指定intent,则必须可以定义参数,如果子例程的执行尝试定义伪参数. 可定义表示设置值:dummy_arg = 2.0.显然,如果这样做,实际参数应该是一个变量.对于intent(inout),无论子例程是否执行此操作,实际参数都必须是可定义的.在没有指定意图的情况下,它取决于子例程的特定调用会发生什么 - 如果子例程没有定义变量,则可以; 如果确实如此,那么就会出现问题 - 例如写入一个常量的实际参数会导致问题.

这并不意味着编译器将诊断所有这些情况 - 标准要求编译器诊断的是另一个问题.在编译时检测意图未指定的案例要求的所有错误几乎是不可能的,因为违规取决于代码的运行时流程.编译器更容易诊断intent(inout)情况并警告您代码出现问题.



2> High Perform..:

如果您的代码将PARAMETER作为您的子程序然后尝试写入的实际参数传递,那么您的问题会让我想知道(现在很多事情)是否会遇到行为上的差异.没有INTENT声明,编译器可能会放弃它,导致奇怪的行为.声明我希望有一个编译时错误.

你和我可能认为INOUT和没有INTENT声明之间没有区别,但是不要忘记那里有很多旧的Fortran程序,并且与旧语言版本的兼容性是新标准的一个重要特征.如果它是正确的(但是狡猾的)FORTRAN77,那么很多人都希望他们的代码能够使用Fortran 90+编译器保持正确(仍然是狡猾的).

快速阅读2003标准确实表明INOUT和无INTENT之间存在差异,但需要更接近读数.如果您进行测试,请告诉我们您的结论; 如果我以后有时间,我会亲自测试并告诉你.


我构建了四个测试用例,尝试修改子例程中的参数.两个带有外部子程序的测试 - 即在一个文件中自己 - 有和没有意图(inout).编译器不会抱怨任何这些.这不是一个惊喜(没有接口)和由此产生的exe段错误.我已经卡住的子程序的模块中的最后两个测试,看看在针对无意图壳体和一个编译器错误的段错误("实际参数(1)必须是可定义为伪参数'B’是INTENT = OUT/INOUT")与界面.这是来自debian系统的gfortran 4.4.4-2.
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有