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

MFC Discussion :

Problème en interfacant C et Fortran


Sujet :

MFC

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut Problème en interfacant C et Fortran
    Bonjour à tous,

    je voudrais appeler une fonction Fortran depuis un fichier c. Je me suis donc renseigné sur la question.

    J'ai vu que la principale vigilance à avoir est le fait que le compilo Fortran suffixe le nom des fonctions avec un tiret bas. Donc lors de l'appel en C, il faut appeler en fait le nom de la fonction fortran concaténé au tiret bas.

    Donc voici l'appel que je fais en C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    extern void fsim_(int *i, float  *r);
    void main()
    {
    int i=100;
    float r;
    fsim_(&i, &r);
    }
    et la fonction Fortran toute bête sur laquelle je fais le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    subroutine FSim(i,r)
    integer i
    real r
    r = i
    return
    end
    Si je compile les 2 fichiers indépendamment, pas d'erreurs, pas d'avertissements, tout à l'air de bien se passer.
    Mais c'est au moment d'effectuer l'éxécution :
    error LNK2001: unresolved external symbol _fsim_
    Debug/main.exe : fatal error LNK1120: 1 unresolved externals
    Ce qui m'a tout l'air d'être une erreur de linkage. Pourtant j'ai bien inclus le fichier fortran au projet (je suis sous VC6.0).

    Toute suggestion sera la bienvenue !
    Merci,

    karl3i.

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Un exemple trouvé dans MSDN reprenant les declarations en C et en FORTRAN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /*     File CMAIN.C   */
     
    #include <stdio.h>
     
    extern int __stdcall FACT (int n);
    extern void __stdcall PYTHAGORAS (float a, float b, float *c);
     
    main()
    {
        float c;
        printf("Factorial of 7 is: %d\n", FACT(7));
        PYTHAGORAS (30, 40, &c);
        printf("Hypotenuse if sides 30, 40 is: %f\n", c);
    }
     
    C    File FORSUBS.FOR
    C
          INTEGER*4 FUNCTION Fact (n)
          INTEGER*4 n [VALUE]
          INTEGER*4 i, amt
          amt = 1
          DO i = 1, n
            amt = amt * i
          END DO
          Fact = amt
          END
     
          SUBROUTINE Pythagoras (a, b, c)
          REAL*4 a [VALUE]
          REAL*4 b [VALUE]
          REAL*4 c [REFERENCE]
          c = SQRT (a * a + b * b)
          END
    Cordialement

  3. #3
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut

    Je sais que pour faire appel à des fonctions en assembleur depuis un programme c, il faut mettre le tiret avant le nom de la fonction. As-tu essayé ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // MODULE FORTRAN
    subroutine _FSim(i,r)  // Avec un tiret
    integer i 
    real r 
    r = i 
    return 
    end
     
    // MODULE C
    extern void fsim(int *i, float  *r);       // Sans le tiret
    void main() 
    { 
    int i=100; 
    float r; 
    fsim(&i, &r);      // Sans le tiret
    }
    On sait jamais
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Merci pour vos aides !
    Elijha : En Fortran, un tiret bas ne peut pas commencer le nom d'une fonction.
    Pipin : Merci pour le code.

    Voilà la solution pour ceux que ca intéresse :

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "fsim_.h"
     
    void main()
    {
    int i=100;
    float r;
    FSIM(i, &r);
     printf("is has the value %d and r has the value %f  \n",i,r);
    }
    fsim_.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern void __stdcall FSIM (int i, float  *r);
    Et enfin FSim.f
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          subroutine Fsim (a,c) 
          integer*4 a [VALUE]
          real*4 c [REFERENCE] 
          c = a 
          end
    Karl3i.

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    En fait, le tiret bas, c'est pour les compilos type gcc...

    Pour VC++, qui ne peut rien faire comme tout le monde, il faut mettre dans le code C le nom de la routine ou de la fonction en majuscules.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Exact, merci de la précision.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Je suis un débutant sur Visual C++. J'ai ce meme probleme c'est à dire appeler des routines Fortran depuis Visual C++.

    Je voudrais savoir comment on compile une routine Fortran sous VC 6.0 et comment faire le linkage apres.

    Merci.

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

Discussions similaires

  1. C/Fortran Problème d'interface
    Par DelilahHinxs dans le forum Débuter
    Réponses: 2
    Dernier message: 13/05/2008, 22h01
  2. Interface graphique en Fortran
    Par janviech dans le forum Fortran
    Réponses: 4
    Dernier message: 02/08/2006, 10h31
  3. Problème d'interface de base de données avec Frontpage
    Par Auxtown-Son dans le forum Outils
    Réponses: 3
    Dernier message: 11/07/2006, 16h42
  4. divers problèmes d'interface
    Par tourlourou dans le forum Delphi
    Réponses: 1
    Dernier message: 27/05/2006, 12h34
  5. [VISUAL EDUTOR] Problème Affichage Interface
    Par mathieu77186 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 23/03/2006, 17h08

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