fortran中的函数指针

时间:2013-05-21 10:10:10

标签: fortran fortran77

是否有可能在Fortran中有函数指针?现在我有一些像这样的代码的代码:

subroutine flag(iflag,a,b)

integer n, a, b, ii, iflag

do ii = 1, n
     if (iflag.eq.0) a+b
     else a-b  
end do    

return
end

变量“n”具有巨大的值,因此要运行此代码,我觉得我浪费了很多时间使用“if”命令。是否有可能写出类似函数指针的东西(我不确定我的意思),这样代码就像这样:

subroutine flag(iflag,a,b)

*depending on the iflag the subroutine flag is automatically 
precompiled to call either flag_plus or flag_minus*     

return
end

subroutine flag_plus(a,b)

integer n, a, b, ii

do ii = 1, n
     a+b
end do    

return
end

subroutine flag_minus(a,b)

integer n, a, b, ii

do ii = 1, n
     a-b  
end do    

return
end

如果有可能,我可以通过避免“if”循环来节省大量时间。这样的东西有可能远程吗?

1 个答案:

答案 0 :(得分:7)

在Fortran 77中,你可以拥有一个有限的函数指针变量,即你可以将一个过程的名称作为参数传递给另一个过程(本质上是一个函数指针)。但是,您不能拥有包含过程地址的变量,然后“调用”该变量。

从Fortran 2003开始,过程指针变量是该语言的一部分。

话虽如此,我认为您的示例问题可以通过像

这样的事情更容易解决

if (iflag == 0) then  ! Why is iflag not of type logical?
  do ii = 1, n
    a + b
  end do
else
  do ii = 1, n
    a - b
  end do
end if

确保对其进行分析以查看它是否有任何效果。现代CPU有很好的分支预测器,并且在整个循环期间不会改变的分支测试几乎是最好的情况(经验法则:预测的分支接近于免费)。哎呀,您的编译器甚至可以进行上述类型的优化。

相关问题