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 :

dll fait en Fortran depuis VC++ visual studio 2008


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut dll fait en Fortran depuis VC++ visual studio 2008
    bonjour, j'ai un problème pour appeler une dll, depuis VC++, qui à été fait en fortran.

    de façon général les entrées sont 2 int et 20 floats: (la fonction à l'intérieure de la dll s'appelle "DLL_SIMULATEUR")

    DLL_SIMULATEUR(int int, float, float ..., float)



    J'ai fait des tests sous Visual Basic et la dll marche très bien, le code en VB est:

    --- function declaration ---

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Declare Sub DLL_SIMULATEUR Lib "C:\vpp53.dll" (CodeError As Integer, n As Integer, t As Double, dt As Double, TWS As Double, TWA As Double, ec As Double, Ang As Double, _
    X As Double, Y As Double, z As Double, psi As Double, teta As Double, phi As Double, _
    Vx As Double, Vy As Double, vz As Double, omx As Double, omy As Double, omz As Double, Course As Double, Cap_Compass As Double, Leeway As Double, MomentSafran As Double)

    --- call to dll ---
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call DLL_SIMULATEUR(CodeErreur, n, t, dt, TWS, TWA, ec, Ang, X, Y, z, psi, teta, phi, Vx, Vy, vz, omx, omy, omz, Course, Cap_Compass, Leeway, MomentSafran)


    Aussi, j'ai fait pas mal des trucs sous matlab, et pour appeler la dll sous matlab il faut écrire une fichier .h, donc, le heder est comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef simul_h
    #define simul_h
    EXPORTED_FUNCTION double __stdcall simul(int*, int*, double*, double*,..., double*);
    #endif
    et l'appelle à la dll se fait comme ça: (ça est dans le fichier .m)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    loadlibrary('VPP53.dll','SIMUL_V100.h');
     
    [a0,input1,input2,input3...input22]=calllib('SIMUL_V100','simul',Val1,Val2,Val3...Val22);
    unloadlibrary('VPP53.dll')
    ou a0 est un ptr pour le matlab

    MAIS quand j'essai d'appeler la dll depuis VC++, je ne sais pas quoi faire... j'ait toujours pas mal des erreurs du type "Violation d'accès lors de la lecture de l'emplacement 0x00000000"

    le code en C++ que je suis en train de tester est:


    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    // Test3.cpp*: définit le point d'entrée pour l'application console.
    //
    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
     
    // DLL function signature
    typedef double (*importFunction)(int, int, float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float);//
     
     
     
    int main(void)
    {
     
     
    	int CodeErrDll=0;
    	int n=0;
    	float t =0; 
    	float Dt = 0;
    	float Tws = 0;
    	float Twa = 0;
    	float AngleBoom = 0;
    	float AngleSafran = 0;
    	float X = 0;
    	float Y = 0;
    	float Z = 0;
    	float Psi =0;
    	float Teta = 0;
        float Phi = 0;
    	float Vx = 0;
    	float Vy = 0;
    	float Vz = 0;
    	float Omx = 0;
    	float Omy = 0;
    	float Omz = 0;
    	float Course = 0;
    	float CapCompas = 0;
    	float Leeway = 0;
    	float MomentMecheSafran=0;
     
    	importFunction addNumbers;
    	double *result = 0;
     
    	// Load DLL file
    	HINSTANCE hinstLib = LoadLibrary(TEXT("vpp53.dll"));
    	if (hinstLib == NULL) {
    		printf("ERROR: unable to load DLL\n");
    		return 1;
    	}
     
    	// Get function pointer
    	SimU = (importFunction)GetProcAddress(hinstLib, "DLL_SIMULATEUR");
    	if (SimU == NULL) {
    		printf("ERROR: unable to find DLL function\n");
    		FreeLibrary(hinstLib);
    		return 1;
    	}
     
    	// Call function.
    	SimU(CodeErrDll,n, t,Dt,Tws,Twa,AngleBoom,AngleSafran,X,Y,Z,Psi,Teta,Phi,Vx,Vy,Vz,Omx,Omy,Omz,Course,CapCompas,Leeway,MomentMecheSafran);
     
     
    	// Unload DLL file
    	FreeLibrary(hinstLib);
     
    	// Display result
    	printf("The result was: %f\n", result);
     
    	return 0;
    }

    Que est ce que j'ai fait mal??? je dois recevoir dans la reponse de la dll les mêmes 24 paramètres actualises ...

    Merci bcp
    Miguel

  2. #2
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Je dirais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (__stdcall *importFunction)(int, int, float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float);
    EDIT: Heu, non. Plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (__stdcall *importFunction)(int, int, double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double);
    EDIT 2 (décidément). A moins que Fortran passe les arguments par référence (ça je ne sais pas). Dans ce cas c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (__stdcall *importFunction)(int*, int*, double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*,double*);

Discussions similaires

  1. Réponses: 7
    Dernier message: 12/11/2008, 10h09
  2. Création DLL Visual Studio 2008 : Chargement impossible
    Par Bleys dans le forum Visual Studio
    Réponses: 0
    Dernier message: 07/08/2008, 11h03
  3. problème de DLL sous visual studio 2008
    Par kira09 dans le forum C++
    Réponses: 2
    Dernier message: 12/06/2008, 12h50
  4. Utilisation dll - visual studio 2008 - c++
    Par >-[]-Fab-[]-< dans le forum Windows
    Réponses: 9
    Dernier message: 22/05/2008, 15h53
  5. Réponses: 4
    Dernier message: 13/02/2008, 15h05

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