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):
Cette dll nomme FDLL.dll a ete compilee avec Intel Visual Fortran en passant par un projet de type Win32 Dynamic-Link Library.
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
J'ai ensuite un projet Win32-Console sous Visual C++ 2005 nomme C_SPASMO contenant les deux fichiers suivants :
Un fichier header FDLL.h :
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
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
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.
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; }
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 ...
Partager