Vargas : appel des fonctions Fortran à partir de C


Quelques recommandations utiles :
  1. 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.
  2. Il est recommandé de faire l'édition de liens avec xlf.
  3. 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.
  4. 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