Fortran-将运行时if替换为编译-if

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (29)

我有一个子程序,其中包含一个简单的if-语句,在中间,我想去掉它。原因是我预先知道该语句是正确的还是错误的,这取决于调用发生的位置,而不是基于输入数据。这甚至更有吸引力,因为它是一个1-线,如果这真的没有太多的作用。现在有一个额外的逻辑输入,它纯粹用于if语句,它被调用了两次-一次用“false”,一次用“true”。

本质上,我希望在编译过程中使if-语句工作,但是#ifdef将不允许相同子例程的两种不同的用法/配置。愚蠢的解决方案是完全复制子例程,使用“true”段拥有一个实例,而另一个实例只使用“false”段。然而,除了这是远远不够优雅(并且有99.9%的相似性),这是一个麻烦,一旦子程序在未来的变化。我要指出的是,我并不意味着重载子例程(至少在“传统”意义上不是这样),尽管这是一个大致相同的概念。

因此,我的问题是-是否有解决这种情况的办法,或者我必须把它作为一个运行时if语句,并有一个额外的逻辑真/假输入?

提问于
用户回答回答于

所以我的理解是,代码是这样的:

module mymod
    implicit none
contains
    subroutine mysub(a, l)
        integer, intent(inout) :: a
        logical, intent(in) :: l
        a = mod(a**3, 53)
        if (l) then
            a = a + 1
        else
            a = a - 1
        end if
    end subroutine mysub
end module mymod


program myprog
    use mymod
    implicit none
    integer :: b
    b = 10
    call mysub(b, .TRUE.)
    print *, b
    call mysub(b, .FALSE.)
    print *, b
end program myprog

你担心的是mysub子例程的效率不高,因为它有一个if语句,即使编译器在编译时知道它每次使用哪条路径。

在你进一步调查这个问题之前,我强烈建议你评估一下这是否必要。所能做的一切都会降低代码的可读性,降低可维护性,并且最多只会带来轻微的性能提高。

可以编写两个不同的子程序,并且在一个单独的文件中拥有相同的部分,并且INCLUDE它分为两个子程序,如下所示:

same.inc:

        integer, intent(inout) :: n
        n = mod(n**3, 53)

分款f90:

module mymod
    implicit none
contains
    subroutine mysub_true(n)
        include 'same.inc'
        n = n + 1
    end subroutine mysub_true
    subroutine mysub_false(n)
        include 'same.inc'
        n = n - 1
    end subroutine mysub_false
end module mymod

与预处理器一起,甚至可以进行所有操作:

mysub.inc:

#if PATH == 1
#define SUB_NAME mysub_true
#else
#define SUB_NAME mysub_false
#endif

    subroutine SUB_NAME(n)
        integer, intent(inout) :: n
        n = mod(n**3, 53)
#if PATH == 1
        n = n + 1
#else
        n = n - 1
#endif
    end subroutine SUB_NAME

#undef SUB_NAME
#undef PATH

我的F90:

module mymod
    implicit none
contains

#define PATH 1
#include mysub.inc

#define PATH 0
#include mysub.inc

end module mymod

这是否使阅读变得更容易或更难,取决于相同部分的复杂性。

所属标签

可能回答问题的人

  • 天使的炫翼

    17 粉丝531 提问36 回答
  • 富有想象力的人

    3 粉丝0 提问29 回答
  • o o

    4 粉丝494 提问27 回答
  • 学生

    3 粉丝476 提问27 回答

扫码关注云+社区

领取腾讯云代金券