首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fortran中的断言

Fortran中的断言
EN

Stack Overflow用户
提问于 2014-02-12 09:48:55
回答 3查看 5.5K关注 0票数 7

Fortran是否有一个与C assert等效的标准函数/关键字?

我找不到Fortran2003标准中提到的Fortran2003。我已经找到了一些如何使用预处理器的方法,但是在这个回答中,建议编写自己的断言。不使用预处理器就可以创建这样的用户函数/子例程吗?

我希望这些断言对于发行版构建是禁用的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-12 09:53:08

据我所知,在Standard中没有这样的语句或函数/子程序。但是--正如您已经说过的--您可以在Fortran中使用自己的子程序/函数和/或OOP来实现这个目标。请参阅Arjen关于此主题的优秀

票数 3
EN

Stack Overflow用户

发布于 2014-02-12 13:08:18

在Fortran中,条件编译从来没有真正流行过,也没有标准的预处理器。如果让你的预处理器切换一个虚拟断言例程不是你想要解决的事情,你可以.

定义一个全局参数,例如:

代码语言:javascript
复制
logical, parameter :: debugging = .true.

如果你有紧张的性格,你可以把它放到一个模块中,并使用--将它关联到需要它的每个范围;在我看来,在这里使用全局参数似乎是一种合理的方法。

然后编写有保护的测试,如

代码语言:javascript
复制
if (debugging) call assert(...)

一旦您想要发布代码,请将debugging的值设置为.false.,尽管我还没有对此进行测试,因此您可能关心的是,任何当前的Fortran编译器都可以在遇到等效表达式时删除死代码。

代码语言:javascript
复制
if (.false.) call assert(...)

而且,您发布的代码将不会为对assert例程的虚拟调用付出任何代价。

另一种方法可能是创建一个模块,我们将其命名为assertions,如下所示:

代码语言:javascript
复制
module assertions

contains

  subroutine assert_prd(args)
    ! declare args
  end subroutine

  subroutine assert_dbg(args)
    ! declare args
    ! now do do some assertion checking and exception raising, etc
  end subroutine

end module assertions

然后,当您使用-关联它们时,可以重命名这些子程序,例如:

代码语言:javascript
复制
use, non_intrinsic :: assertions, assert=>assert_dbg

并在要关闭断言检查时将其更改为assert=>assert_prd。不过,我怀疑编译器可能不会完全消除对空子例程的调用,而且您的生产代码可能会对它遇到的每一个断言都付出很小的代价。

除此之外,请参阅Arjen Markus的论文,@AlexanderVogt已经向您推荐了这篇文章。

票数 8
EN

Stack Overflow用户

发布于 2014-07-14 07:50:22

对于固定表单源,可以使用-fd-lines-as-comments发布版本,使用-fd-lines-as-code进行调试构建(IntelFortran-d-lines),并使用自定义断言:

代码语言:javascript
复制
D      if (assert_condition) then
D         write(*,*) 'assert message'
D         call exit(1)
D      endif
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21724186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档