Erreur : Debug Assertion Failed

electroonn Messages postés 49 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 27 novembre 2007 - 28 mars 2007 à 01:01
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 7 avril 2007 à 19:41
Bonjour,
j'essaye de faire une application qui fait appelle a une boite de dialogue pour le saisi des informations de l'utilisateur, j'ai fait alors un porjet MFC de type boite de dialogue.
le probleme survient alors quand je veux prendre les données entrées par l'utilisateur et les affecter a mes variables, exemple:

void CGoBackNDlg::OnOK()
{
 UpdateData(TRUE);


 CGoBackNApp Client(m_numPort,m_IPaddr);
 Client.FileSize(m_FileName);
 Client.ReadFile(m_FileName);
 Client.SendFileInfo(m_FileName);
}
c'est a dire qu'une fois l'utilisateur appuit sur ok, je veux recuperer les variables m_numPort, m_IPaddr et m_FileName qui sont membre de la classe CGoBackNDlg derivé de CDialog.
en executant le programme il me sort alors le message "Debug Assertion Failed".
vous auriez une idee peut etre?
merci

10 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
28 mars 2007 à 14:59
Premierement il faut que tu mettes le code qui reference client apres le code qui verifie le OnOK() du dlg;

Ensuite vérifie que tu as bien lié tes variables par VALEUR aux champs du dialog.
EX : m_numPort doit etre créé sur ton champ editBox en tant que int par valeur (pour que le UpdateData() marche)

Dans ton dialog principal :
#include "GoBackNDlg.h"

CGoBackNDlg dlg;
if( dlg.DoModal() ==  IDOK )
{
   // ici le code qui référence les données
   CGoBackNApp Client(m_numPort,m_IPaddr);
   Client.FileSize(m_FileName);
   // ECT...
}
else
{
   // Les données ne sont pas bien formatées
}

Ce qui te permets de vérifier les entrées utilisateur dans le OnOK()
du dlg et renvoyer different de IDOK si les données ne sont pas bien formatées.

A mon avis tu as un problème de liaison de variables membres avec les controles du dlg.
Car une de ces variables n'étant pas initialisée, elle provoque un debug assert dans ton code qui les utilise.
0
electroonn Messages postés 49 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 27 novembre 2007
28 mars 2007 à 19:25
voici le code de la classe CGoBackNApp  dont client est un objet:

class CGoBackNApp : public CWinApp
{


private:
 sockaddr_in serveur_addr;           //adresse du serveur
 sockaddr_in client_addr;            //adresse du client
 SOCKET sockfd;
 int server_addrLen;
 int client_addrLen;
 timeval TimeOut;
 char Buffer[10][1400];
 int size;


public:
 CGoBackNApp();
 CGoBackNApp(UINT Port,CString IP);
 void FileSize(CString UpLoadFile);
 void ReadFile(CString UpLoadFile);
 void SendFileInfo(CString UpLoadFile);
 void SendFile();
};

ensuite tu parles de la liaison des variables par valeur, je ne comprend pas trop c koi !
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
28 mars 2007 à 21:58
Et bien pour que le updateData marche, il faut que tu crée tes variables membres en liaison avec les controles grace à  :
virtual void DoDataExchange(CDataExchange* pDX);

avec pour des liaisons VALEUR par exemple :
DDX_Text(pDX, IDC_UNIDCONTROLE, m_sMembreCString);
ou des liaisons REF :
DDX_Control(pDX, IDC_UNIDCONTROLE, m_MembreEditBox);
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
28 mars 2007 à 22:03
C'est pourquoi on peut déclarer comme membre :

CEdit m_edit; // lié ref au control
Et là on utilise :
CString uneChaine = m_edit.GetWindowText();

OU

CString m_str;    // lié valeur au control
UpdateData(TRUE); // La valeur du controle passe dans m_str;

Donc tu dois cliquer droit sur ton controle et demander l'option :
AddMember
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
electroonn Messages postés 49 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 27 novembre 2007
28 mars 2007 à 22:32
moi ce que j'ai fait, c'est que pour chaque control j'ai ajouté une variable. dans ma boite de dialogue j'ai 3 EditBox, et pr chaqu'une j'ai ajouté une variable avec la ClassWizar a savoir m_numPort, m_IPaddr et m_FileName.


pour les liaisons, je pense que c géré automatiquement, en voici pr mon exemple:


void CGoBackNDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CGoBackNDlg)
 DDX_Text(pDX, IDC_FileName, m_FileName);
 DDV_MaxChars(pDX, m_FileName, 20);
 DDX_Text(pDX, IDC_IPaddr, m_IPaddr);
 DDV_MaxChars(pDX, m_IPaddr, 15);
 DDX_Text(pDX, IDC_Port, m_numPort);
 DDV_MinMaxUInt(pDX, m_numPort, 0, 65536);
 //}}AFX_DATA_MAP
}
0
electroonn Messages postés 49 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 27 novembre 2007
28 mars 2007 à 22:36
le probleme survient a la ligne suivante
CGoBackNApp Client(m_numPort,m_IPaddr);
qd je declare un objet CGoBackNApp et qd je vx les initialiser avec les variables de la boite de dialogue, et biensur le probleme persiste aussi qd j'utilise des fonctions qui prennent en parametre ces memes variables.
pour contourner ce probleme j'ai supprimer la class CGoBackNApp , et j'ai intégré ces attributs et ces méthodes a la classe de la boite de dialogue, mais c une solution provisoire, et j'aimerais mieux avoir une classe apart pr ma propre utilisation.
0
Nemesis007 Messages postés 4 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 7 avril 2007
7 avril 2007 à 13:30
J'ai à peu près le même problème, dès que mon programme arrive à un UpdateData(), il fait un "Debut Assertion Failed" ... Pourtant, mon programme passe une fois dans la boite de dialogue permettant d'initialiser les valeurs des EditBox et biensur là ca marche parfaitement :(

Voici le programme en question : http://plouf803.free.fr/Ventilateur.rar

Merci de votre aide :)
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
7 avril 2007 à 18:25
Aï ! j'avais pas vu mais tu dérives ton objet de CWinApp !!!
Tu ne peux pas déclarer un objet dérivant de CWinApp plusieurs fois...

class CGoBackNApp : public CWinApp

CWinApp est instancié par MFC, là c'est vraiment un problème de compréhension de l'architecture MFC...
0
electroonn Messages postés 49 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 27 novembre 2007
7 avril 2007 à 18:35
mais je compren pas, ou est ce que t'as vu que j'ai déclaré l'objet CGoBackNApp  plus qu'une fois ??
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
7 avril 2007 à 19:41
C'est MFC qui le fait avec :
CWinApp::InitInstance();
0
Rejoignez-nous