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 :

Debug Assertion Failer avec DLL C++


Sujet :

C++

  1. #1
    Membre confirm� Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    D�tails du profil
    Informations personnelles :
    �ge : 36

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par d�faut Debug Assertion Failer avec DLL C++
    Salut � tous,

    j'ai cr�� un programme en C++ qui tourne tr�s bien en console alors j'ai d�cid� de cr�er une interface avec VB et j'ai passer ce programme en DLL mais je connais pas grand chose � VB donc j'ai fait quelque recherche pour savoir comment appeller une DLL

    sous VB je declare donc ma fonction comme ceci

    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
     Public Declare Function DemoPC Lib "Ma_DLL.dll" (ByVal AgeP#, ByVal Taillen#, ByVal Poidsn#, ByVal hum%, ByVal Vet(,) As Double) As Double
     
    Private Sub Calculer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Calculer.Click
     
            Dim AgeP#
            Dim Taillen#
            Dim Poidsn#
            Dim hum%
     
            AgeP = Ag.Value
            Taillen = Taille.Value
            Poidsn = Poids.Value
            hum = HR.Value
     
            Ta.Text = DemoPCPretherm(AgeP, Taillen, Poidsn, hum, Vet)
     
        End Sub
    End Class

    et dans la DLL:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
     
    extern "C++" __declspec(dllexport) double DemoPC(double Ag,double Taillen,double poids, int hum)
    {
    //...
    }
    Le programme se lance bien, je rentre les valeurs � saisir dans les cases appropri�s et quand je clique sur calculer, se qui appel un fonction de la DLL qui doit me renvoyer un resultat j'ai un message qui s'affiche:
    Debug Assertion Failed

    Program:...
    File:C:\program files\microsoft visual studio8\vc\include\vector
    Line:756

    Expression: vector subscript out of range
    et si je clique sur ignorer:
    Debug Assertion Failed

    Program:...
    File:C:\program files\microsoft visual studio8\vc\include\vector
    Line:757

    Expression"Standard C++ libraries Out of Range",0)

    sa fait 2 jour que je cherche une solution, j'ai v�rifi� mon programme mais je vois pas de quoi sa vient
    peut �tre un probl�me de compatibilit�?

  2. #2
    Membre chevronn�
    Inscrit en
    Ao�t 2004
    Messages
    556
    D�tails du profil
    Informations forums :
    Inscription : Ao�t 2004
    Messages : 556
    Par d�faut
    Tu es sur le forum C++ et tu n'apportes que du code VB

    Il faudrait qu'on voit le code C++ pour te dire si le probl�me provient de ce c�t�.

    Sinon, pourquoi ne pas faire ton interface graphique en C++ ?

  3. #3
    Membre confirm� Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    D�tails du profil
    Informations personnelles :
    �ge : 36

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par d�faut
    Pour le code C++ il appelle une autre fonction qui est dans une autre DLL mais j'ai essay� en mettant les 2 fonction dans la meme DLL mais sa change rien � mes erreurs

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <math.h>
    #include <vector>
    #include <dos.h>
    #include <string.h>
    #include <boost/assign/std/vector.hpp>
    #include <iostream>
    #include <windows.h>
     
    #pragma comment (lib, "fonction_calcul.lib")
     
     
    using namespace boost::assign;
     
     
     
    extern "C++" __declspec(dllimport) std::pair<double,double> Calcul_(double Ta, double poids, double taille, double Ap, double Ag, double HR, double vet[4][3]); 
     
    extern "C++" __declspec(dllexport) double DemoPC(double Ag,double Taillen,double poids, int hum,double vet[4][3])
    {
     
     
    	int somme(0);
    	int r,j;
    	double Ta,Mr,M,HR;
    	double WtG,i,min,max,med,taille;
            double Ap=2;
     
    	const double precision=0.1;
    	const int incubator_upper_limit=39;
    	const int incubator_lower_limit=29;
     
    	for(j=0;j<=4;j++)
    	{
    		vet[j][0]=j+1;
    	}
     
    	taille=Taillen;
     
     
    	for(i=1;i<=Ap;i++)
    	{
    		WtG=0.00138*pow(i,3)-0.126*pow(i,2)+3.65*i-14,5; 
    		poids=poids+WtG/1000*poids;
    	}
     
    	taille=Taillen+Ap*0,2; 
     
    	HR=hum;
    	min=incubator_lower_limit;
    	max=incubator_upper_limit;
    	r=0;
     
    	while(abs(max-min)>precision)
    		{	
    			med=min+fabs((max-min)/2);
     
    			std::pair<double,double>Metab=Calcul_(med,poids,taille,Ap,Ag,HR,vet);
    			Mr= Metab.first;
    			M=Metab.second;
     
    			if(Mr>M)
    			{
    				max=med;
    				min=min;
    			}
    			else
    			{
    				max=max;
    				min=med;
    			}
    			r=r+1;				
    		}
     
     
    	return med;
     
     
    }
    Le code fait un peu "crade" mais bon pour l'instant il faut juste que sa fonctionne car il y aura des modifications

    Pour l'interface, c'est pas moi qui choisie c'est le maitre de stage mais bon sa me parait plus simple en VB il suffit de mettre des petit bouton partout
    sinon j'aurais utilis� C++ builder qui m'est beaucoup plus familier ...

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Note que tes fonctions export�es doivent �tre en __stdcall, en plus de extern "C".

    Edit: � moins que?
    C'est du VB.Net, �a, non?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirm� Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    D�tails du profil
    Informations personnelles :
    �ge : 36

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par d�faut
    je doit mettre __stdcall � la place de __declspec?
    sinon j'utilise Visual Studio 2005

    Mais je crois avoir trouver la partie qui cause probl�me en metant des bouts de fonction en commentaire. Ce probl�me ce trouve dans la fonction qui se trouve dans l'autre DLL.

    donc voila ce qui cause probl�me
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
            double psH2O=pression[long int(Tsk*10)+1];
    	double PsH2O=psH2O/100;
    voila un peu plus du 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    std::pair<double,double> Calcul_Metabolisme(double Ta, double poids, double taille, double Ap, double Ag, double HR, double vet[4][3])
    {
     
    //déclaration de variable...
     
            std::vector<long int> pression;
            pression+= 610,615,619,624,628,633,637,642,647,651,
    	656,661,666,670,675,680,685,690,695,700,
    	705,710,715,720,725,730,736,741,746,752,
    	757,762,768,773,779,784,790,795,801,807,
            //...
            101325;
     
            double paH2O=pression[long int(Ta*10)+1];
    	double PaH2O=paH2O/100;
     
    //des calculs...
     
           if(Tabdo>=37)
    	{
    		Mr=Mr*pow(2.29,(T-37)/10);
    		Tsk=30.46+(0.121*Ta-0.571*Va+0.254*PaH2O*HR/10)+(0.00128*Mr*poids/24/1.16/BSA-3.57*Icl);
    	}
     
     
    	double psH2O=pression[long int(Tsk*10)+1];
    	double PsH2O=psH2O/100;
     
    //encore des calculs....
     
    return std::make_pair( mr, M );
     
    }
    Le truc bizarre c'est que j'ai deja une structure identique � celle qui pose probl�me juste apr�s le vecteur mais celle la marche tr�s bien
    Si vous trouver l'erreur faite moi signe

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Citation Envoy� par vtk37 Voir le message
    je doit mettre __stdcall � la place de __declspec?
    Non, en plus.

    PS: L'erreur doit vouloir dire que tsk poss�de une valeur trop �lev�e.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirm� Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    D�tails du profil
    Informations personnelles :
    �ge : 36

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par d�faut
    Tsk est calculer une fois puis recalculer en fonction de T

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    double Tsk=30.46+(0.121*Ta-0.571*Va)+(0.254*PaH2O*HR/10)+(0.00128*Mr*poids/24/1.16/BSA)-3.57*Icl;
     
     
    	double  T=(Tsk-15.02)/0.52;
     
     
    	if(T>=37)
    	{
    		Mr=Mr*pow(2.29,(Tabdo-37)/10);
    		Tsk=30.46+(0.121*Ta-0.571*Va+0.254*PaH2O*HR/10)+(0.00128*Mr*poids/24/1.16/BSA-3.57*Icl);
    	}
    si je met le if en commentaire le programme tourne bien mais des que je le remet => bug
    pourtant j'ai fait tourner mon programme en console en affichant les 2 Tsk et ils sont toujours compris entre 32 et 35 avec 5 chiffre derri�re la virgule en g�n�ral ...

  8. #8
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 507
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 507
    Par d�faut
    Je suis peut-�tre compl�tement � la masse mais une variable non typ�e en VB, c'est un variant, pas un double, et encore moins un tableau de double � 2 dimension.

    Soit vous utiliser les bons types dans
    "Public Declare Function DemoPC"
    Soit vous modifiez la signature de votre fonction C++ pour qu'elle prenne des variants.

  9. #9
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    "#" est peut-�tre un suffixe de type en VB, comme ce fut le cas dans d'autres langages de type BASIC.

    Edit: C'est plut�t le ByVal Vet(,) As Double que je trouve suspect. Je pense qu'il n'est pas transmis en tant que tableau C++ (et encore moins en tant que vector), mais plut�t en tant que SAFEARRAY*.

    Enfin �a, c'est en supposant qu'on soit en VB pur. En VB.Net, il peut s'agir d'un tableau manag�, auquel cas j'ignore de quelle fa�on il sera marshall�...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirm� Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    D�tails du profil
    Informations personnelles :
    �ge : 36

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par d�faut
    je connais rien � VB sa fait que 2 jour que je l'utilise
    alors je ne fait que suivre les tuto
    donc pour les declaration je me suis bas� sur sa :

    http://gilmir.developpez.com/tutoriels-vb6/tutoriel3/

  11. #11
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Tr�s mauvais: C'est un tutoriel pour Visual Basic 6, mais d'apr�s la signature de tes fonctions, tu d�veloppes en Visual Basic .Net!

    Les diff�rences sont trop importantes pour que tu puisses utiliser ce tutoriel avec .Net: tu dois soit r�cup�rer Microsoft Visual Basic 6.0, soit trouver un tutoriel pour VB.Net.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre confirm� Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    D�tails du profil
    Informations personnelles :
    �ge : 36

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par d�faut
    ok je pens� que ce serai pareil comme sa reste des choses de base... j'ai plus qu'a me mettre en quete XD

    Pour le tableau, il contient juste des 0 ou des 1 en fonction de l'�tat de case � cocher

  13. #13
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Euh...
    1. Un tableau � deux dimensions, �a n'est pas "des choses de base". D�j�, un tableau � une seule dimension c'est pas s�r...
    2. Tu utilises des nombres � virgule flottante double-pr�cision juste pour stocker des 0 et des 1 ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre confirm� Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    D�tails du profil
    Informations personnelles :
    �ge : 36

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Par d�faut
    en fait dans le programme VB il y a juste une colonne qui est modifier,

    le tableau est ensuite r�utiliser dans ma DLL et des double sont stock� dans les 2 derni�re colonne

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for(j=0;j<=4;j++)
    	{
    		vet[j][0]=j+1;
    	}
    	vet[0][3]=3.55;
    	vet[1][3]=3.55;
    	vet[2][3]=3.55;
    	vet[3][3]=3.55;
    	vet[4][3]=co;
     
    //...

    Edit: http://plasserre.developpez.com/v1-6tab.htm
    apparament pour les tableaux je vois pas vraiment de diff�rence, ce que j'ai fait doit marcher

Discussions similaires

  1. Probleme avec Debug.Assert
    Par Bonero dans le forum VBA Access
    R�ponses: 4
    Dernier message: 28/03/2012, 13h35
  2. debug assertion failed sur un delete venant d'une DLL
    Par italiasky dans le forum Visual C++
    R�ponses: 13
    Dernier message: 02/12/2008, 15h02
  3. Debug avec DLL et Matlab
    Par flipper203 dans le forum Visual C++
    R�ponses: 3
    Dernier message: 18/07/2006, 14h52
  4. R�ponses: 13
    Dernier message: 20/06/2005, 14h13

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