IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

appel de routines fortran depuis un programme en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut appel de routines fortran depuis un programme en C
    Bonjour à tous,

    je travaille actuellement sur un programme de cacul vectoriel en C. Pour que celui-ci soit opérationnel, j'ai besoin d'une librairie de calcul du CERN (lapack). Celles-ci sont en fortran. Evidemment le problème c'est que je ne sais absolument pas comment appeller des routines fortran à partir d'un programme en C (bien qu'apparemment ça soit possible).
    J'ai bien cherché avant de poster et n'ai rien trouvé de vraiment "croustillant" à se mettre sous la dent. Si quelqu'un à un lien vers un tuto ou des conseils, je suis preneur!

    Bonne journée à tous!

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par booby
    J'ai bien cherché avant de poster et n'ai rien trouvé de vraiment "croustillant" à se mettre sous la dent.
    Et ca ? Ca devrait au moins donner une piste de demarrage...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    merci pour ta réponse. je teste et je vous tiens au courant.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    bon, ce coup ci je pense avoir à peu près tout lu, mais, pas tout compris malheureusement...

    Je récapitule:

    je travaille sour red hat (9?).

    j'ai une bibliotheque de routines de calcul du CERN lapack.a, dans lequel je souhaite utiliser une subroutine ssteqr.o. Le tout à partir du programme en C.

    D'apres la documentation la subroutine ssteqr.f ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SUBROUTINE SSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO)
    CHARACTER * 1 COMPZ
    INTEGER N, LDZ, INFO
    REAL D(*), E(*), Z(LDZ,*), WORK(*)
    Si j'ai bien compris je dois déclarer la fonction ssteqr dans mon code comme ci dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ssteqr(char compz, int n, float *d, float *e, float *z, int ldz, int *info);
    maintenant reste à indique au programme C, l'endroit où aller chercher cette fonction (c'est ici que je bloque), d'ou ma question: doit-t-on ajouter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <quelquechose.h>
    ?

    Ensuite pour la compilation (sachant que je fais de la compilation séparée avec gcc), "l'ajout de bibliothèque lors de l'édition de lien" me parait bien obscur...

    Si quelqu'un se sent de m'éclairer un poil, merci pour vos réponses.

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Ta routine Fortran est donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SUBROUTINE SSTEQR( COMPZ, N, D, E, Z, LDZ, WORK, INFO)
    Le compilateur C va attendre un prototype pour cette routine. Il est propre de le mettre dans un fichier entete, ssteqr.h par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef H_SSTEQR
    #define H_SSTEQR
     
    void ssteqr(char *compz, int *n, float *d, float *e, 
                      float *z, int *ldz, float *work, int *info);
     
    #endif
    Remarque que l'ensemble des parametres sont des pointeurs, car le Fortran utilise toujours un passage par reference (que l'on peut simuler par l'utilisation de pointeurs, en C).

    Tout code C qui utilise ta fonction va #include "ssteqr.h". La compilation va donc bien se passer.

    Ensuite, il y a l'edition de lien, c'est a dire l'ajout du code de SSTEQR pour former l'executable final. Il faut indiquer ou trouver ce code. Dans ton cas, c'est dans la bibliotheque lapack.a. Regarde les options -l et -L de gcc pour assurer le lien (malheureusement, le nom de ta bibliotheque ne respecte pas la convention de nommage lib<something>.a, donc cela complique un peu les choses).

    Enfin, il y a le gros probleme: le tableau a deux-dimensions Z. Et la c'est penible. Fortran est column-major (la dimension la plus a gauche varie le plus vite). C est row-major (la dimension la plus a droite varie le plus vite). Il faut donc s'assurer que les elements sont dans le bon ordre : tu remarqueras que dans le prototype ci-dessus, j'ai mis float *z et non pas **z. Du point de vue de la memoire, le Fortran et le C voient les tableaux multi-dimensionnels comme un seul espace contigu - donc, un tableau a une seule dimension. Le plus simple[1] est donc, dans ton programme C, de declarer z comme etant un tableau a une dimension, puis le remplir en respectant l'ordre attendu par le Fortran.

    [1] le plus simple est evidemment de tout faire en Fortran...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    Tout d'abord merci pour tes réponses. Je mets ça en application de suite.

    Citation Envoyé par DaZumba
    Enfin, il y a le gros probleme: le tableau a deux-dimensions Z. Et la c'est penible. Fortran est column-major (la dimension la plus a gauche varie le plus vite). C est row-major (la dimension la plus a droite varie le plus vite). Il faut donc s'assurer que les elements sont dans le bon ordre : tu remarqueras que dans le prototype ci-dessus, j'ai mis float *z et non pas **z. Du point de vue de la memoire, le Fortran et le C voient les tableaux multi-dimensionnels comme un seul espace contigu - donc, un tableau a une seule dimension. Le plus simple[1] est donc, dans ton programme C, de declarer z comme etant un tableau a une dimension, puis le remplir en respectant l'ordre attendu par le Fortran.
    Pour ce qui est des indices ça ne devrait pas poser de problèmes, sachant que je travaille avec des matrices carrées symétriques (c'est à dire que la ligne d'indice 1 contient la même chose que la colonne du même indice, ce qui me permet, la plupart du temps de travailler sur une demi-matrice)

    Citation Envoyé par DaZumba
    [1] le plus simple est evidemment de tout faire en Fortran...
    aaaahhh lala... j'aurai du écouter mon directeur, il voulait absolument que je code en fortran... enfin, personne n'est parfait!...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 47
    Par défaut
    Citation Envoyé par DaZumba
    Ensuite, il y a l'edition de lien, c'est a dire l'ajout du code de SSTEQR pour former l'executable final. Il faut indiquer ou trouver ce code. Dans ton cas, c'est dans la bibliotheque lapack.a. Regarde les options -l et -L de gcc pour assurer le lien (malheureusement, le nom de ta bibliotheque ne respecte pas la convention de nommage lib<something>.a, donc cela complique un peu les choses).
    bon alors effectivement ça pose problème... tout se passe bien à la compilation jusqu'a l'édition de lien. Je precise le 'endroit ou se trouve ssteqr.a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -L /USERS/monpath/lapack/lapack.a
    et la bibilotheque qu'il doit utiliser et là il m'indique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc: ssteqr.o: No such file or directory
    enfin... donc je voulais juste connaitre les conventions de nommage afin de renommer le lapack.a en quelque chose de mieux...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécution d'une DLL Fortran depuis un programme Java - JNA
    Par Anthony BIGET dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 28/07/2014, 10h58
  2. Appel de fonction Fortran via un programme C
    Par bybby83 dans le forum Fortran
    Réponses: 3
    Dernier message: 08/01/2009, 10h08
  3. Appel de DLL MATLAB depuis un programme C
    Par jericho dans le forum MATLAB
    Réponses: 1
    Dernier message: 18/02/2008, 16h09
  4. Appel de routine MATLAB depuis Java
    Par habasque dans le forum MATLAB
    Réponses: 4
    Dernier message: 24/09/2007, 18h56
  5. Appel de DLL Fortran depuis C/C++
    Par ultimate_manx dans le forum Fortran
    Réponses: 3
    Dernier message: 31/05/2007, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo