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 :

Appeller C depuis fortran


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 52
    Points : 37
    Points
    37
    Par défaut Appeller C depuis fortran
    Bonjour a tous,

    Quelqu’un pourrait me dire comment appeler une fonction ecrite en C dans fortran?
    Par exemple, prenons le cas de cette fonction qui calcule le carre des elements d'un vecteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void foo(int *nin, double *x)
    {
    	int n = nin[0];
     
    	int i;
     
    	for (i=0; i<n; i++)
    		x[i] = x[i] * x[i];
    }
    Je sais que le plus simple serait d'utiliser simplement le C pour mes analyses mais le hic est que je ne connais pas vraiment le C.

    Merci d'avance pour votre aide

    Arthy

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Tu as essayé ceci ?
    http://www.idris.fr/su/Scalaire/vargas/Fortran_C.html

    Sinon je connaissais f2c qui permet de transformer du code Fortran en C (l'inverse existe peut-être); ça peut être une solution aussi (si le but est d'avoir un programme final).

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 52
    Points : 37
    Points
    37
    Par défaut
    Salut Ehonn,
    Merci pour ta reponse.
    J'ai essaye de suivre les etapes decrites sur le lien que tu m'as donne mais ca ne passe pas.
    1) creation du fichier foc.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    # include <string.h>
    void foo(int n, float x[n]) {
     
       int i;
     
      for (i=0; i<n;i++) x[u]=x[i]*x[i];
     
    }
    2) creation du fichier fof.f90
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    program call_c
     
       implicit none
     
       integer,parameter   :: n=5
       integer                  :: k
       real                      :: x(n)
     
       x=(/(k,k=1,n)/)
       call foo(n,x)
     
    endprogram call_c
    3) compilation
    a)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cc -c foc.c
    gfortran fof.f90 foc.o
    b)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gfortran -c fof.f90
    gcc -c foc.c
    gfortran -o call_c fof.o foc.o
    4) Et j'obtiens le meme message d'erreur ci-dessous en utilisant l'option a ou b pour compiler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    undefined reference to foo_

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Dans le lien, il a écrit :
    si les noms des fonctions C sont suffixés par le caractère '_', il sera nécessaire de spécifier l'option -qextname lors de la compilation du code Fortran
    Il y a aussi écrit que les fonctions doivent prendre les paramètres par adresse.
    Ta fonction serait quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void foo(int * n, float * x)
    {
        int i;
        for (i = 0; i < *n; i++) { x[i] = x[i] * x[i]; }
    }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 52
    Points : 37
    Points
    37
    Par défaut
    Salut Ehonn,

    Je n'ai aucune fonction en C qui possede la caractere '_' car la fonction foo du fichier 'foc.o' n'en contient pas. Les instructions que j'execute sont exactement celles que j'ai precedemment decrites dans mon precedent message.

    Et en prenant en compte la modification que tu as proposee au niveau de la declaration de la fonction foo.c, je n'arrive meme plus a compiler le fichier foo.c

    Arthy

  6. #6
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    En fait, c'est le compilateur qui décore les noms de fonction automatiquement.
    L'option pour GCC est -fno-underscoring.

    J'ai réussi à appeler du code C dans Fortran95 comme ceci :

    Voici le fichier foo.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
     
    void foo(int * n, double * x)
    {
    	int i;
    	for (i = 0; i < *n; i++) { x[i] = i * i; }
     
    	for (i = 0; i < *n; i++) { printf("%f ", x[i]); } printf("\n");
    }
    Voici le fichier appel_c.f95
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    program appel_c
     
    	implicit none
     
    	integer,parameter :: n = 5
    	real              :: x(n)
     
    	call foo(n, x)
    	print "(a)", "end program appel_c"
     
    end program appel_c
    Et voici les lignes de compilatation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc -c -Wall -Wextra foo.c
    gfortran -o appel_c appel_c.f95 foo.o -fno-underscoring
    Le programme s'exécute bien (on peut faire plusieurs appel à foo qui affiche le bon résultat) mais fini mal :s
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ ./appel_c 
    0.000000 1.000000 4.000000 9.000000 16.000000 
    end program appel_c
     
    Program received signal SIGBUS: Access to an undefined portion of a memory object.
     
    Backtrace for this error:
    #0  0x7FD76D12D667
    #1  0x7FD76D12DC34
    #2  0x7FD76C6ED4EF
    Erreur du bus

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 52
    Points : 37
    Points
    37
    Par défaut
    Hello everyone,

    Mon probleme n'a toujours pas ete solutionne

    Arthy

  8. #8
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    En un mois, tu as appris C
    Tu as réussi à faire ce que j'avais fait dans le post précédent ?
    Si non, quelle est l'erreur ?
    Si oui, même question et quels sont les nouveaux programmes ?

Discussions similaires

  1. [Python/FORTRAN(f2py)] Appeler fonction Python depuis Fortran
    Par squallmrs dans le forum Interfaçage autre langage
    Réponses: 1
    Dernier message: 21/06/2012, 11h53
  2. appeler Java depuis Fortran
    Par hazyscl dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 09/07/2008, 13h40
  3. Appel de DLL Fortran depuis C/C++
    Par ultimate_manx dans le forum Fortran
    Réponses: 3
    Dernier message: 31/05/2007, 13h44
  4. Réponses: 20
    Dernier message: 08/09/2006, 10h55
  5. Appels DCOM depuis une application Unix
    Par Dinaïz dans le forum Windows
    Réponses: 1
    Dernier message: 26/08/2005, 13h53

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