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 :

[Debutant] Appel d'une fonction FORTRAN depuis C++


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut [Debutant] Appel d'une fonction FORTRAN depuis C++
    Bonjour a tous,

    Je vous explique ma situation : je suis en stage actuellement et je travaille sur un programme qui doit mixer du C++ avec du Fortran de la facon suivante :
    - C++ gere l'interface, l'import et l'export des donnees
    - Fortran gere les calculs (par des subroutines definies par un autre programmeur)

    J'ai donc un certain nombre de fonctions en Fortran que je dois appeler depuis le code C++.

    Le probleme, c'est que je suis un debutant total en C++ et que j'ai eu beau retourner les tutoriels, la FAQ et les forums C++ et Fortran depuis une semaine, j'ai toujours des erreurs que je ne comprend pas...

    J'ai suivi un exemple qu'une personne avec laquelle je travaille avait trouve sur la toile, et ca m'a donne ca :

    Tout d'abord un code Fortran avec lequel je genere une dll contenant la subroutine sand (qui calcule une variable sand_d a partir de 2 parametres):
    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
    ! FDLL.f90
     
    SUBROUTINE SAND(SAND_D,VFCLAY2D,VFSAND2D)
    IMPLICIT NONE
     
    !DEC$ IF DEFINED (_DLL)
    !DEC$ ATTRIBUTES DLLEXPORT :: SAND
    !DEC$ END IF
     
    REAL SAND_D
    REAL VFCLAY2D
    REAL VFSAND2D
    REAL VFSILT2D
     
    VFSILT2D = MAX(0.0, 100.-VFSAND2D - VFCLAY2D)
    SAND_D = EXP( 0.01*(VFCLAY2D*LOG(0.001)+VFSILT2D*LOG(0.026)+VFSAND2D*LOG(1.025)))
     
    RETURN
    END
    Cette dll nomme FDLL.dll a ete compilee avec Intel Visual Fortran en passant par un projet de type Win32 Dynamic-Link Library.

    J'ai ensuite un projet Win32-Console sous Visual C++ 2005 nomme C_SPASMO contenant les deux fichiers suivants :

    Un fichier header FDLL.h :
    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
    // FDLL.h : main header file for the FDLL DLL
     
    #pragma once
     
    #ifdef C_SPASMO
    #define FDLLSPEC __declspec(dllimport)
    #pragma message("automatic link to FDLL.lib") 
    #pragma comment(lib, "FDLL.lib") 
    #else
    #define FDLLSPEC __declspec(dllexport)
    #endif
     
    #ifdef __cplusplus
    extern "C" 
    {
    #endif
     
    FDLLSPEC void SAND(double *SAND_D, double *VFCLAY2D, double *VFSAND2D);
     
    #ifdef __cplusplus
    } /* extern "C" */
    #endif
    Et un fichier C_SPASMO.cpp contenant le coeur de mon programme :

    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
    // Include declarations
    #include "stdafx.h"
    #include "FDLL.h"
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	double VFCLAY2D[51][101], VFSAND2D[51][101];
    	double SAND_D;
     
                  [...]  // Partie de code affectant des valeurs a VFCLAY2D[I][K] et VFSAND2D[I][K] en lisant dans un fichier de parametres
     
                 SAND(&SAND_D,&VFCLAY2D[I][K],&VFSAND2D[I][K]);
     
                 system("PAUSE");
    	return 0;
    }
    La compilation se passe sans probleme, j'ai copie les DLL Fortran necessaires aux calculs dans le dossier de l'application (libmmdd.dll en l'occurence), mais bien qu'aucune erreur ne s'affiche, le programme me trouve toujours la meme valeur pour SAND_D (en l'occurence -9.25596e+061), quels que soient les valeurs des autres parametres.

    Si quelqu'un a une idee...

    Merci d'avance.

    PS : Ce message a ete edite, je m'excuse aupres de ceux qui ont lu la premiere version, le probleme a pas mal change depuis ...

  2. #2
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    J'ai trouve d'ou venait l'erreur...

    Pour ceux qui auraient le meme type de probleme, l'erreur vient de la compatibilite entre les types de variables C++ et FORTRAN.

    En l'occurence, les REAL de Fortran doivent etre passes en float et non en double.

    Bon, ben j'ai plus de probleme pour le moment alors... (warf, c'est dur d'etre un noob, j'aurais du le voir, ca...)

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    946
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 946
    Points : 1 846
    Points
    1 846
    Par défaut
    Ce n'est pas grave. Merci d'être revenu dire que c'était résolu et d'avoir donné la solution.

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

Discussions similaires

  1. [XL-2007] Appel d'une fonction VBA depuis une feuille
    Par St-Jean dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 23/11/2009, 23h55
  2. Appel d'une fonction javascript depuis un flash
    Par nelk1 dans le forum jQuery
    Réponses: 1
    Dernier message: 25/04/2009, 23h16
  3. Appel d'une fonction "MFC" depuis Java (e.g. GetWindowText)
    Par Tororo73 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 07/01/2009, 11h51
  4. Appel d'une fonction A depuis une fonction B.
    Par LeFlou dans le forum C++
    Réponses: 9
    Dernier message: 22/05/2007, 17h36
  5. [Compilation] Appel d'une fonction C++ depuis du code C
    Par bladerunners dans le forum C++
    Réponses: 1
    Dernier message: 06/09/2006, 14h26

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