gpt4 book ai didi

fortran - Fortran 中的断言

转载 作者:行者123 更新时间:2023-12-04 17:49:09 27 4
gpt4 key购买 nike

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

我找不到 assert我在Fortran2003标准中提到过。我发现了一些如何使用预处理器的方法,但是在这个 answer建议编写自己的断言。是否可以在不使用预处理器的情况下创建这样的用户函数/子程序?

我希望这些断言在发布版本中被禁用。

最佳答案

条件编译在 Fortran 中从未真正流行起来,也没有标准的预处理器。如果让您的预处理器切换进出虚拟断言例程不是您想要解决的问题,您可以...

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

logical, parameter :: debugging = .true.

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

然后编写 protected 测试,例如
if (debugging) call assert(...)

一旦你想释放代码,设置 debugging 的值至 .false.我希望,虽然我没有测试过,所以你可能会关心,任何当前的 Fortran 编译器在遇到相当于的表达式时都可以删除死代码
if (.false.) call assert(...)

并且您发布的代码不会因为对 assert 的虚拟调用而受到惩罚。常规。

另一种方法可能是创建一个模块,我们称之为 assertions ,沿着这些思路:
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

然后,您可以在使用关联时重命名子例程,例如:
use, non_intrinsic :: assertions, assert=>assert_dbg

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

除此之外,请参阅 @AlexanderVogt 向您推荐的 Arjen Markus 的论文。

关于fortran - Fortran 中的断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21724186/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com