Avec Fortran 200 3 il existe un moyen standard et donc indépendant de la plate-forme et du compilateur pour appeler C à partir de Fortran, ainsi que tout langage qui utilise l'interface d'appel C. Aussi pour appeler Fortran à partir de C. Alors que les différents compilateurs ajoutent progressivement des fonctionnalités Fortran 2003 et qu'il existe peu de compilateurs 2003 complets, la liaison ISO C est disponible depuis un certain temps dans de nombreux compilateurs. La liaison ISO C fonctionne mieux que les techniques ad hoc précédentes, qui étaient parfois mal documentées, et variées entre les compilateurs et les plates-formes. Pour appeler C depuis Fortran, vous écrivez une "interface" qui indique au compilateur Fortran qu'il doit utiliser les conventions d'appel C et les types C.
Voici un exemple. Comme l'a écrit Mike, puisque la fonction C++ renvoie void, traitez-la dans le Fortran comme un sous-programme et appelez-la. Ainsi, il n'a pas besoin d'être donné un type. En outre, quelque part dans le Fortran, vous devez réserver le stockage pour le tableau - le plus simple est une déclaration avec une valeur numérique pour la dimension. Et vous avez besoin d'un programme principal dans une langue.
program test_call_C
use iso_c_binding
implicit none
interface c_interface
subroutine get_filled_ar (ar) bind (C, name = "get_filled_ar")
use iso_c_binding
implicit none
integer (c_int), intent (out), dimension (*) :: ar
end subroutine get_filled_ar
end interface c_interface
integer (c_int), dimension (0:3) :: ar
call get_filled_ar (ar)
write (*, *) "Fortran: ar:", ar
stop
end program test_call_C
et C:
void get_filled_ar (
int ar []
) {
ar [0] = 1;
ar [1] = 10;
ar [2] = 100;
return;
}
Exemples de commandes:
gcc -c get_filled_ar.c
gfortran get_filled_ar.o test_call_C.f90 -o test_call_C.exe
./test_call_C.exe
Pour appeler votre code C++, utilisez les commandes suivantes. Le nom spécifié dans le "bind" évite le besoin d'un soulignement de fin pour que votre code C++ fonctionne directement.
g++ -c cplusplus.cc
gfortran cplusplus.o test_call_C.f90 -o test_call_Cplusplus.exe
./test_call_Cplusplus.exe
Merci pour le code détaillé. Dans votre extrait de code, vous avez affecté une taille fixe au tableau ar. Je veux que ar soit un tableau dynamique. Je vais vérifier si cela fonctionne aussi pour un tableau dynamique – cppb