Question

Est-il possible de passer la fonction Fortran 77 en tant que pointeur de la fonction de rappel à C / C ++? si oui, comment?

informations que je trouve sur le web se rapporte à Fortran 90 et au-dessus, mais ma base de code existant est en 77.

Merci beaucoup

Était-ce utile?

La solution

Si cela peut être fait en FORTRAN 77, il sera compilateur et spécifique de la plate-forme. La nouvelle norme ISO C La liaison de Fortran 2003 fournit un moyen standard de mélange Fortran et C, et toute langue qui suit ou peuvent suivre les conventions d'appel de C, comme C ++. Bien que formellement une partie de Fortran 2003, et alors qu'il ya très peu de Fortran qui soutiennent pleinement l'ensemble de Fortran 2003, la liaison ISO C est pris en charge par de nombreux compilateurs Fortran 95, y compris gfortran, G95, Soleil, ifort, etc. Je vous recommandons d'utiliser l'un de ces Fortran 95 compilateurs et la méthode de liaison ISO C plutôt que de déterminer une méthode pour une méthode particulière. Depuis FORTRAN 77 est un sous-ensemble de Fortran 95, pourquoi ne pas compiler votre code existant avec l'un de ces compilateurs, en utilisant Fortran 95 pour ajouter cette nouvelle fonctionnalité?

J'ai appelé les procédures Fortran de C en utilisant la liaison ISO C, mais ne les ont pas passé comme pointeurs. Il devrait être possible. Les étapes sont les suivantes:

1) on déclare la fonction Fortran avec l'attribut Bind (C),

2) on déclare tous les arguments à l'aide de types spéciaux, tels que nombre entier (c_int), qui correspondent aux types de C.

Les étapes 1 et 2 font la fonction Fortran interopérable avec C.

3) On obtient un pointeur de C à cette fonction Fortran avec la fonction Fortran intrinsèque « de c_funloc », en attribuant la valeur du pointeur vers un pointeur de type « c_funptr ».

4) Dans le code Fortran, vous déclarez la routine C que vous voulez passer le pointeur de fonction avec une interface, déclarant en en termes Fortran, mais en utilisant l'attribut et types interopérables Bind (C) de sorte que le Fortran compilateur sait utiliser la convention d'appel de C -. rendant interopérable de routine C avec Fortran

Quand vous appelez la routine C dans le code Fortran, vous pouvez passer le pointeur de la fonction créée à l'étape 3.

MISE À JOUR: Exemple de code:. Le programme principal Fortran « test_func_pointer » passe un pointeur vers la fonction Fortran « my_poly » à la routine C « C_Func_using_Func_ptr » et reçoit le dos de résultat de cette fonction 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

et

float C_Func_using_Func_ptr (

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

) {

   return ( (*Func_ptr) (x) );

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top