如何在Fortran中为函数名设置别名

Sam*_*Tan 27 alias fortran pointers function subroutine

不确定标题是否放好.建议欢迎.

这就是我想要做的.检查一个条件,然后决定在循环中使用哪个函数.例如:

if (a < 0) then
    loop_func = func1
else
    loop_func = func2
endif
Run Code Online (Sandbox Code Playgroud)

然后我可以loop_func在编写循环时用作指针.这两个函数都采用完全相同的输入,并且是基于值的解决问题的不同方法a.这将允许我只有一个代码块,而不是两个几乎相同的块.这也适用于子程序.

有什么想法可以实现吗?

谢谢.

M. *_* B. 38

是的,Fortran有程序指针,所以你实际上可以别名一个函数名.这是一个代码示例,它为函数指针"f_ptr"分配一个函数或另一个函数.此后程序可以使用"f_ptr",并且将调用所选择的函数.

module ExampleFuncs

   implicit none

contains

function f1 (x)
  real :: f1
  real, intent (in) :: x

  f1 = 2.0 * x

  return
end function f1


function f2 (x)
   real :: f2
   real, intent (in) :: x

   f2 = 3.0 * x**2

   return
end function f2

end module ExampleFuncs


program test_func_ptrs

    use ExampleFuncs
    implicit none

   abstract interface
      function func (z)
         real :: func
         real, intent (in) :: z
      end function func
   end interface

   procedure (func), pointer :: f_ptr => null ()

   real :: input

   write (*, '( / "Input test value: ")', advance="no" )
   read (*, *) input

   if ( input < 0 ) then
      f_ptr => f1
   else
      f_ptr => f2
   end if

   write (*, '(/ "evaluate function: ", ES14.4 )' )  f_ptr (input)

   stop

end program test_func_ptrs
Run Code Online (Sandbox Code Playgroud)

  • @steabert.Fortran 2003有什么问题?gfortran应该对过程/接口构造没有问题,对吧? (3认同)
  • 过程指针是Fortran 2003的一部分.自2008年中期以来,它们一直得到gfortran的支持 - 请参阅http://gcc.gnu.org/wiki/Fortran2003和http://gcc.gnu.org/wiki/ProcedurePointers (2认同)
  • @steabert:那些不支持程序指针的主要编译器是什么?(不是gcc,pgi,cray,IBM,NAG或intel).谁被迫在他们的项目中的每个文件中使用F77/F95? (2认同)
  • @steabert:正在考虑的F2003功能是程序指针.哪个主编译器不支持程序指针? (2认同)
  • @JonathanDursi:是的,你是对的,但我是在做一个更笼统的陈述。我真的不喜欢该标准部分实现的事实,对我来说,它使“标准”的存在变得毫无用处,因为实际上您必须去查找通常支持或不支持的功能。 (2认同)

wal*_*lyk 6

大多数 Fortran 实现没有操作函数指针或过程指针的标准方法。然而,Fortran 2003 及更高版本有一些东西。(参见本页第 6 页。)

对于给定的情况,这将非常有效:

 function func1 (p1, p2, etc)
 ...  as you have it already
 end

 function func2 (p1, p2, etc)
 ...  as you have it already
 end

 function funcselect (a, p1, p2, etc)
     if (a < 0) then
          x = func1 (p1, p2, etc)
     else
          x = func2 (p1, p2, etc)
     endif
 end
Run Code Online (Sandbox Code Playgroud)

然后只需funcselect使用额外的参数进行调用,而不是使用loop_func.

  • 我不同意“Fortran 没有操作函数指针或过程指针的标准方法”的说法。过程指针是 Fortran 2003 语言标准的一部分。 (4认同)
  • 如果您只想使用函数指针进行优化,那么在这种情况下是否能实现任何加速是值得怀疑的。我什至可以想象相反的情况,具体取决于编译器优化和条件的可预测性。 (3认同)
  • OP 表示,他们希望它是为了清晰并避免代码重复,这都是有价值的目标;使用函数指针可以避免代码重复,而无需将 if 语句深入循环,这也是一个好处。 (3认同)
  • @沃利克。在提出问题时,我稍微简化了问题。这个条件实际上并不是“(a&lt;0)”,它要复杂得多。而且该函数不仅仅是在一个简单的循环中使用。为了让您直观地了解该函数,该函数将在 100 次迭代中被访问超过 800 万次。 (2认同)