7 votes

Appel de sous-routines Fortran avec des arguments facultatifs à partir de C++

Comment puis-je référencer une fonction Fortran dans un en-tête C++ qui utilise des arguments facultatifs ? Aurais-je un prototype dans l'en-tête pour chaque combinaison possible d'appels ? Ou est-ce même possible ?

Par exemple, Fortran :

subroutine foo(a, b, c) bind(c)
   real, intent(in), optional :: a, b, c
   ...
end subroutine foo

10voto

Vladimir F Points 12375

Ce n'est pas possible, du moins de manière portative, à moins de rendre la sous-routine bind(C) .

Une fois que vous l'avez fait bind(C) il s'agit simplement du passage d'un pointeur qui peut être NULL du côté C.

subroutine foo(a, b, c) bind(C, name="foo")
   real, intent(in), optional :: a, b, c
   ...
end subroutine foo

(pour une plus grande portabilité real(c_float) de la iso_c_binding devrait être utilisé, mais cela est quelque peu tangentiel à cette question).

En C(++)

extern "C"{
  void foo(float *a, float *b, float *c);
}

foo(&local_a, NULL, NULL);

et ensuite vous pouvez créer une fonction C++ qui appelle foo et qui utilise des paramètres optionnels de type C++.

Cette capacité a été autorisée dans Fortran dans la spécification technique ISO/IEC TS 29113:2012 sur l'interopérabilité supplémentaire de Fortran avec C.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X