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 régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    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 confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    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 régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    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 éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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 régulier Avatar de vtk37
    Inscrit en
    Avril 2009
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2009
    Messages : 159
    Points : 116
    Points
    116
    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