Vargas : appel des fonctions Fortran à partir de C
Quelques recommandations utiles :
- Le passage des paramètres en Fortran s'effectue par adresse, tandis qu'en
C il s'effectue par valeur. Lors d'un appel Fortran dans un code C, tout
argument doit donc être un pointeur.
- Il est recommandé de faire l'édition de liens avec xlf.
- Le compilateur C génère, pour chaque fonction, des références externes
dont les noms sont suffixés par le caractère '_'; il sera alors nécessaire
de spécifier l'option -qextname lors de la compilation du code Fortran
pour qu'il en fasse de même.
- xlf convertit tous les noms externes en minuscules.
Vous devez donc appeler la fonction Fortran en minuscules. Si vous souhaitez
l'appeler avec un autre nom comportant des majuscules, utilisez l'option
-brename à l'édition de liens avec xlf.
vargas : cat appelf.c
#include <stdio.h>
void main () {
int lg_chaine = 0;
float reel = 0.0;
char chaine[] = "chaine_C ";
lg_chaine = strlen(chaine);
fonction( &lg_chaine, &reel, chaine);
printf("chaine finale = %s\n", chaine);
printf("longueur de la chaine finale = %d\n", lg_chaine);
printf("réel passé par adresse = %f\n", reel);
}
vargas : cat fonction.f
SUBROUTINE fonction( lg_chaine, reel, chaine)
INTEGER, INTENT(INOUT) :: lg_chaine
REAL, INTENT(INOUT) :: reel
CHARACTER(LEN=lg_chaine), INTENT(INOUT) :: chaine
chaine = TRIM(chaine) // ' et chaine_Fortran'
lg_chaine = LEN_TRIM(chaine)
reel = 100.0
END SUBROUTINE fonction
vargas : xlc -c appelf.c
vargas : xlf90 -c -qextname fonction.f
vargas : xlf appelf.o fonction.o
vargas : a.out
chaine finale = chaine_C et chaine_Fortran
longueur de la chaine finale = 26
réel passé par adresse = 100.000000
© CNRS - IDRIS, 13/01/2012