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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre exp�riment�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    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 �prouv�

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    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 �m�rite
    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 : 56
    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
    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

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    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 du Club
    Inscrit en
    Juillet 2003
    Messages
    10
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 10
    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 exp�riment�
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    D�tails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 10
    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