ssnniifff....j'ai perdu mon pointeur !!! - Programmation
Marsh Posté le 08-03-2001 à 15:11:57
ok !bon je vais détailler....
j'ai une structure CCDL avec diverse information :
struct CCDL {unsigned char mode,
timer,
result,
text,....et d'autre
};
j'ai une boite de dialogue avec sa classe associé CTest_timingDlg.
dans cette boite de dialogue je crée 2 pointeur sur ma structure ,puis j'initialise leur variables :
donc dans test_timingDlg.h je fait:
CCDL * camera1;
CCDL * camera2;
dans test_timingDlg.cpp ,dans l'initdialog je fait :
camera1 = new CCDL;
camera2 = new CCDL;
camera1->mode = 128;
camera1->timer= 0;
...etc
camera2->mode = 128;
camera2->timer= 0;
...etc
jusque la tout va bien, j'ai bien mon pointeur qui s'initialise correctement et la structure qui se remplit!!
le pb c'est quand je veux faire passer cette structure toute belle a une autre fonction situer dans un autre fichier
donc je reprend:
sur ma boite de dialogue j'ai un bouton demarrer qui va me lancer une acquisition sur ma camera, ces valeur vont etre placer dans ma structure puis traité, la methode qui les traite s'appelle traite_camera et ce situe dans gestion_camera.cpp.donc au debut de ma fon ction j'appelle mon pointeur camera1:
struct CCDL * pDlg =_pCcd::Instance()->TheCTest_timingDlg->camera1;
j'explique ce que je fait ( donc ce qui devrait marcher !!):
j'initialise un pointeur pDlg de type structure CCDL .Pour cela je vais chercher le pointeur camera1 dans l'instance de ma boite de dialogue ( vous suivez toujours???).mais le pb c'est que j'ai perdu mon pointeur pDlg vaut 0xcdcdcdcd c'est a dire rien!!!!
pour ceux qui veulent pousser dans le détail voila comment je fait l'instance
donc dans le fichier _pCcd.h
#include "test_timingDlg.h"
#include "Gestion_Camera.h"
class CGestion_Camera;
class CTest_timingDlg ;
class _pCcd
{
public:
_pCcd();
virtual ~_pCcd();
static _pCcd * Instance();
static _pCcd * _instance;
CTest_timingDlg * TheCTest_timingDlg;
CGestion_Camera * TheCGestionCamera;
_pCcd * TheC_Ccd;
};
et dans le fichier _pCcd.cpp :
#include "stdafx.h"
#include "test_timing.h"
#include "_pCcd.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
_pCcd::_pCcd()
{
TheCTest_timingDlg = new CTest_timingDlg;
TheCGestionCamera = new CGestion_Camera;
this->_instance = this;
}
_pCcd::~_pCcd()
{
}
_pCcd * _pCcd::_instance;
_pCcd * _pCcd::Instance()
{
if(_instance ==0)
{
_instance = new _pCcd;
}
return _instance;
}
Bon je pense avoir assez détailler, merci de m'aider c'est pour un projet urgent !!!
je remercie donc d'avance toute les réponse !!!
Marsh Posté le 08-03-2001 à 15:50:18
alors ?personne pour m'aider???
on me demande des détail , j'en donne et maintenant je fait fuir tout le monde!!
PLEASE HELP ME!!!
Marsh Posté le 08-03-2001 à 16:02:25
Il doit manquer la définition du membre statique _instance:
_pCcd* _pCcd::_instance = 0;
--Message édité par Verdoux--
Marsh Posté le 08-03-2001 à 17:49:20
Si j'ai bien compris, la classe _pCcd est un singleton ?
En principe j'initialise _instance dans Instance() et non dans le constructeur.
Je m'explique : quand tu appelles un membre statique d'une classe avec l'operateur de portée, il n'y a pas de raison pour que le constructeur ait déjà été appelé une fois !
Comme Verdoux l'a dit, il manque _pCcd* _pCcd::_instance = 0;
mais il vaut mieux aussi que tu mettes le constructeur en protected (le _instance=this n'est alors plus utile).
Marsh Posté le 09-03-2001 à 10:38:10
tout dabord je vous remercie pour l'aide que vous m'apportez
donc j'ai modifié le programme comme ceci :
_pCcd::_pCcd()
{
TheCTest_timingDlg = new CTest_timingDlg;
TheCGestionCamera = new CGestion_Camera;
// this->_instance = this;
}
_pCcd::~_pCcd()
{
}
_pCcd * _pCcd::_instance=0;
_pCcd * _pCcd::Instance()
{
if(_instance ==0)
{
_instance = new _pCcd;
}
return _instance;
}
ça c'etait pour le .cpp et voici pour le .h:
class _pCcd
{
public:
virtual ~_pCcd();
static _pCcd * Instance();
static _pCcd * _instance;
CTest_timingDlg * TheCTest_timingDlg;
CGestion_Camera * TheCGestionCamera;
_pCcd * TheC_Ccd;
protected:
_pCcd();
};
mais ça jne marche pas....
j'ai essayer de mettre
_pCcd* _pCcd::_instance = 0;
dans le constructeur mais j'ai des erreur a la compil!!!
en fait je pense que c'est plus un pb de fond que j'ai : JE NE COMPREND PAS CE QUE JE FAIT!!!
donc si vous voulez m'expliquer exactement ces histoires d'instance ça pourrait m'aider !
merci.
Ps: on m'a dit (sur un autre forum) de faire ceci pour récupérer mon pointeur:
void CTest_timingDlg::getCamera378(CCDL *monPointeur)
{
memset(monPointeur, '\0', sizeof( struct CCDL ) );
memcpy( monPointeur, this->camera378 , sizeof( struct CCDL ));
}
ça ne marche pas non plus!!!
Marsh Posté le 09-03-2001 à 15:47:58
_pCcd::Instance()->TheCTest_timingDlg->camera1 va récupérer le pointeur caméra1 de l'objet TheCTest_timingDlg crée par l'appel TheCTest_timingDlg = new CTest_timingDlg; dans le constructeur de _pCcd.
Il faut donc voir si le constructeur de la classe CTest_timingDlg initialise correctement le pointeur en question.
Marsh Posté le 08-03-2001 à 14:21:15
salut!!
bon voila mon pb:
j'initialise un pointeur de structure dans une fonction , je lui passe quelque parametre ....(jusque la tout va bien)
ensuite je passe a une autre fonction( pas dans le meme fichier)et je veux récuperer mon pointeur tout initialiser, mais entre temp il s'est barrer!!!
voici d'ailleurs comment je fait pour le récuperer ( ce qui ,ne doit pas etre ça apparement !!)
struct CCDL * pCamera = _pCcd::Instance()->TheCTest_timingDlg->camera;
ça vous dit qq chose?????
merci pour vos réponse!!