Domanda

E 'possibile passare FORTRAN funzione 77 come un puntatore a funzione di callback per C / C ++? se sì, come?

informazioni che ho trovato sul web si riferisce a Fortran 90 e al di sopra, ma il mio codice di base eredità è nel 77.

Molte grazie

È stato utile?

Soluzione

Se si può fare in FORTRAN 77, sarà compilatore e piattaforma specifica. La nuova norma ISO C Il legame del Fortran 2003 fornisce un metodo standard di miscelazione Fortran e C, e qualsiasi linguaggio che segue o possono seguire le convenzioni di chiamata di C, come C ++. Mentre formalmente una parte del Fortran 2003 e mentre ci sono estremamente pochi compilatori Fortran che supportano pienamente la totalità del Fortran 2003, l'ISO C Binding è supportata da numerosi Fortran 95 compilatori, tra cui gfortran, G95, Sole, ifort, ecc Quindi ho consiglia utilizzando uno di questi Fortran 95 compilatori e il metodo ISO rilegatura C anziché capire qualche metodo per un metodo particolare. Poiché FORTRAN 77 è un sottoinsieme di di Fortran 95, perché non compilare il codice legacy con uno di questi compilatori, utilizzando Fortran 95 per aggiungere questa nuova funzionalità?

Ho chiamato procedure Fortran da C utilizzando l'ISO C Binding, ma non li hanno passati come puntatori. Dovrebbe essere possibile. I passi sono:

1) si dichiara la funzione Fortran con l'attributo Bind (C),

2) si dichiara tutti gli argomenti che utilizzano i tipi speciali, come intero (c_int), che corrispondono ai tipi di C.

I passaggi 1 e 2 rendono la funzione Fortran interoperabile con C.

3) È possibile ottenere un C-puntatore a questa funzione Fortran con la funzione instrinsic Fortran "c_funloc", assegnando il valore del puntatore a un puntatore di tipo "c_funptr".

4) Nel codice Fortran, si dichiara la routine C che si desidera passare il puntatore a funzione ad un interfaccia, dichiarandolo in in termini Fortran, ma utilizzando l'attributo Bind (C) e tipi interoperabili in modo che il Fortran compilatore sa utilizzare la convenzione C-chiamando -. L'interoperabile C routine con Fortran

Poi, quando si chiama il C-routine di nel codice Fortran, è possibile passare il puntatore a funzione creata nel passaggio 3.

UPDATE: Esempio di codice:. Il Fortran programma principale "test_func_pointer" passa un puntatore alla funzione Fortran "my_poly" alla routine C "C_Func_using_Func_ptr" e riceve la schiena risultato di questa funzione 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

e

float C_Func_using_Func_ptr (

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

) {

   return ( (*Func_ptr) (x) );

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top