C++ 将fortran 77函数传递给C/C++;

C++ 将fortran 77函数传递给C/C++;,c++,c,fortran,fortran77,fortran-iso-c-binding,C++,C,Fortran,Fortran77,Fortran Iso C Binding,是否可以将fortran 77函数作为回调函数指针传递给C/C++? 如果是,怎么做 我在网上找到的信息与fortran 90及以上版本有关,但我的遗留代码库是77 非常感谢如果可以用FORTRAN 77完成,它将是特定于编译器和平台的。FORTRAN 2003的新的ISO绑定提供了混合FORTRAN和C的标准方式,以及遵循或可以遵循C的调用约定的任何语言,如C++。虽然正式成为Fortran 2003的一部分,而且完全支持整个Fortran 2003的Fortran编译器非常少,但许多Fort

是否可以将fortran 77函数作为回调函数指针传递给C/C++? 如果是,怎么做

我在网上找到的信息与fortran 90及以上版本有关,但我的遗留代码库是77


非常感谢

如果可以用FORTRAN 77完成,它将是特定于编译器和平台的。FORTRAN 2003的新的ISO绑定提供了混合FORTRAN和C的标准方式,以及遵循或可以遵循C的调用约定的任何语言,如C++。虽然正式成为Fortran 2003的一部分,而且完全支持整个Fortran 2003的Fortran编译器非常少,但许多Fortran 95编译器都支持ISO C绑定,包括gfortran、g95、Sun、ifort、,因此,我建议使用这些Fortran 95编译器和ISO C绑定方法中的一种,而不是为特定的方法找出某种方法。既然FORTRAN 77是FORTRAN 95的一个子集,为什么不使用其中一个编译器编译遗留代码,使用FORTRAN 95添加此新功能

我使用ISO C绑定从C调用了Fortran过程,但没有将它们作为指针传递。这应该是可能的。这些步骤是:

1) 使用Bind(C)属性声明Fortran函数

2) 您可以使用与c类型匹配的特殊类型(例如integer(c_int))声明所有参数

第1步和第2步使Fortran函数可以与C进行互操作

3) 使用Fortran内部函数“C_funloc”获取指向此Fortran函数的C指针,将指针值分配给类型为“C_funptr”的指针

4) 在Fortran代码中,声明要通过接口传递函数指针的C例程,用Fortran术语声明,但使用绑定(C)属性和可互操作类型,以便Fortran编译器知道使用C调用约定——使C例程可与Fortran互操作

然后,当您在Fortran代码中调用C例程时,可以将在步骤3中创建的函数指针传递给它

更新:代码示例:Fortran主程序“test_func_pointer”将指向Fortran函数“my_poly”的指针传递给C例程“C_func_using_func_ptr”,并从该C函数接收结果

module func_pointer_mod

   use, intrinsic :: iso_c_binding

   implicit none

   interface C_func_interface

      function C_Func_using_Func_ptr ( x, Func_ptr ) bind (C, name="C_Func_using_Func_ptr")

         import

         real (c_float) :: C_Func_using_Func_ptr
         real (c_float), VALUE, intent (in) :: x
         type (c_funptr), VALUE, intent (in) :: Func_ptr

      end function C_Func_using_Func_ptr

   end interface C_func_interface


contains

   function my_poly (x) bind (C, name="my_poly")

      real (c_float) :: my_poly
      real (c_float), VALUE, intent (in) :: x

      my_poly = 2.0 * x**2 + 3.0 * x + 5.0

      return

   end function my_poly

end module func_pointer_mod


program test_func_pointer

   use, intrinsic :: iso_c_binding

   use func_pointer_mod

   implicit none

   type (c_funptr) :: C_func_ptr

   C_func_ptr = c_funloc ( my_poly )

   write (*, *) C_Func_using_Func_ptr ( 2.5_c_float, C_func_ptr )

   stop

end program test_func_pointer


@Paul linux、64位、Intel、gfortran、g++或icchmm,这对源代码管理员来说可能太多了。也许我应该考虑一些替代方案。但是谢谢你,我会记住这一点(如果我们最终放弃77)P.S.你可以编写Fortran 95包装来调用你的Fortran 77函数,并且保持Fortran 77函数不变。您可以将指针传递给包装函数,包装函数将通过iso c绑定声明。
float C_Func_using_Func_ptr (

   float x,
   float (*Func_ptr) (float y)

) {

   return ( (*Func_ptr) (x) );

}