passer fonction Fortran 77 à C / C ++
-
04-10-2019 - |
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
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) );
}