Par défaut Fonction de conversion d'un type specifique vers un int en retour d

develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 11 oct. 2006 à 22:29
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009 - 15 oct. 2006 à 09:55
Bonjour,

Voici mon problème; en fait j'ai un grand programme relatif a un système de detections.
Ce programme a plusieurs threads qui tournent ensemble.

Je suis amener a afficher sur une List Box les erreurs d'initialisations
de deux cameras. Il existe deja une classe "CHardware" qui permet d'initialiser
pas mal de périphériques, elle interroge notamment les dll des cameras. D'autres classes font appel
aussi à cette classe.

A coté de ça, j'ai une classe "CViewSasInitialisation" qui a notamment la fonction "OnTimer()"
qui affiche sur la Liste Box les erreurs d'initialisations des deux cameras. Le but recherché.

Actuellement cette fonction "OnTimer" affiche des erreurs mais par le biais d'une variable
"m_initHardwarestatus" laquelle s'est crée lors de l'instanciation de la camera notament grâce
a la classe "CHardware" et plus precisement sa fonction Init() qui a envoit a cette variable des
numéros qui correspondent donc à différents types d'erreurs.Comme je vous avez deja dit
cette classe reçoit des données des dll des cameras mais ne retourne pas ces données car il
s'agit d'un type specifique (FRstval).

Les donnees que recoit la classe "CHardware" sont des textes du genre "FS_BAD_PARAMETER"
et ces textes sont definit par des #define dans une autre classe de mon programme, la classe  "CInit".

Donc ce que je voudrais faire maintenant c'est modifier cette fonction Init() de la classe
"CHardware" afin qu'elle puisse retourner un type FRstval mais pour cela il faut que je passe
par une fonction supplementaire qui me convertirait le type (FRstval) par un type (intà
 car en effet ma fonction Init() a comme valeur de retour un entier et de
plus que cette valeur sera passée à la variable "m_initHardwarestatus"

Au finalité cette variable passera à la fonction de la classe "CViewSasInitialisation"
 qui affichera avec un switch le resultat sur la liste box.
 
En effet j'ai dans ma fonction 'isProblemHardware()' qui est apellée par cette
variable ''initHardwarestatus' de la fonction 'Ontimer(UINT nIDEvent)'

Fonction devant changer afin de recuperer les valeurs donnees par la dll a la variable tmp et qu'il faudra retourner a la variable ''initHardwarestatus'.

C'est dans cette fonction qu'il faut une conversion du retour tmp mais comment ?

//////
int CHardware::Init()    ///////inittialisations avec les differents erreurs possible
{
 try
 {
  FSRetVal tmp;
  string strFile;
  CInit m_Init;
 
  if(m_bver==0) ////testali mettre appel du this ?
   strFile=string((LPCTSTR)(m_Init.Get_Params_Hardware_Config_FileInit()+"BestCamHardware_"+m_Init.Get_Params_Hardware_Config_FileInit_NumA()+".ini"));
  else
   strFile=string((LPCTSTR)(m_Init.Get_Params_Hardware_Config_FileInit()+"BestCamHardware_"+m_Init.Get_Params_Hardware_Config_FileInit_NumB()+".ini"));
   tmp = m_pHardware->SetConfigFilePath((char*)strFile.c_str()); 
                      
   if(tmp!= FS_SUCCESS)
   {
    if(m_bver==0)
    {
     TRACE("SetConfigFilePath Hardware 1 failed\n");
    
     return 1;     // ici retourner le temp avec conversion ??????
    }
    else
    {
     TRACE("SetConfigFilePath Hardware 2 failed\n");
     return 2;
    }
   }
   
   TRACE("Init cam :%d  - config :%s\n",m_bver,(char*)strFile.c_str());
   tmp = m_pHardware->Initialize();
   if(tmp!= FS_SUCCESS)
   {
    m_pHardware->FreeMem();
    if(m_bver==0)
    {
    TRACE("Initialize Hardware 1 NOK\n");
    TRACE("Explication Hardware 1 %s\n",FSRetVal_Names[tmp]);
    return 3;
    }
    else
    {
    TRACE("Initialize Hardware 2 NOK\n");
    TRACE("Explication Hardware 2 %s\n",FSRetVal_Names[tmp]);
    return 4;
    }
   }
   char* p_cdllver;
   p_cdllver=m_pHardware->GetDLLVersion();
  m_Init.Set_Params_Hardware_Config_Dllversion(p_cdllver);
   TRACE("Init Hardware OK pour cam : %d\n",m_bver);
  return 0;
 }
 catch(...)
 {
  TRACE("Init NOK\n");
  return 5;
 }
}
/////

La fonction qui devrait afficher sans doute encore avec un switch dans lequel  on mettra la valeur de retour de la fonction Init()

/////
void CViewSasInitialisation::OnTimer(UINT nIDEvent)
{
   
    unsigned int uiSecurity;
    CString strDatalist;                                      
    uiSecurity=m_Init.Get_Params_Sas_Config_Securiy();

    // Vérifie le mode de fonctionnement
    if(nIDEvent==ID_CLOCK_SAS)
    {
        KillTimer(ID_CLOCK_SAS);
        CMy99090Doc    *pDoc= (CMy99090Doc *) GetDocument();           

        UpdateData(true);

        if(uiSecurity& LEVEL_1)
        {
            if(pDoc->isProblemeAcquisition())
                m_bPblAcquisition=true;
            else
                m_bPblAcquisition=false;
               
        if(m_Init.Get_Params_General_ModeProcess ()==PROCESS_SAS_AUTOMATIQUE)
        {
           if(uiSecurity& LEVEL_1)
            {
                int initHardwarestatus=pDoc->isProblemeHardware();
                    if(initHardwarestatus)     
                        m_ListeHardware.ResetContent ();  
                    else
                        m_bPblHardware=false;
                  switch(initHardwarestatus)
                  {
                  case 1: 
                          m_bPblHardware=true;
                          strDatalist.Format ("SetConfigFilePath Hardware 1 failed");
                          m_ListeHardware.AddString (strDatalist);    //////testali necessaire?
                          break;
                  case 2: 
                          m_bPblHardware=true;
                          strDatalist.Format ("SetConfigFilePath Hardware 2 failed");
                          m_ListeHardware.AddString (strDatalist);
                          break;
                  case 3: 
                          m_bPblHardware=true;
                          strDatalist.Format ("Initialize Hardware 1 NOK");
                          m_ListeHardware.AddString (strDatalist);
                          //("Explication Hardware 1 %s\n",FSRetVal_Names[tmp]);  //  ???
                         // strDatalist.Format ("Explication Hardware 1  %d", FSRetVal_Names[tmp]);
                          m_ListeHardware.AddString (strDatalist);
                          break;

                  case 4: 
                          m_bPblHardware=true;
                          strDatalist.Format ("Initialize Hardware 2 NOK");
                          m_ListeHardware.AddString (strDatalist);
//                          strDatalist.Format ("Explication Hardware 2  %d", FSRetVal_Names[tmp]);
                          m_ListeHardware.AddString (strDatalist);
                          break;

                 /* default:

                          strDatalist.Format ("Dans une boucle");
                          m_ListeHardware.AddString (strDatalist);
                          m_ListeHardware.AddString (strDatalist);
                          break;
                 */
                        /* default:
                        m_bPblHardware=true;
                        strDatalist.Format ("Init NOK, autres raisons %d");
                        m_ListeHardware.AddString (strDatalist);
                        break;
                   
                        */      
                     }
             
           
                    if(pDoc->isIniteHardware())
                    m_bHardware=true;
                    else
                    m_bHardware=false;
            }
            else
            {
                m_bPblHardware=false;
                m_bHardware=true;
            }

            if(pDoc->isProblemeModbus())
                m_bPblModbus=true;
            else
                m_bPblModbus=false;

            if(pDoc->isInitModbus())
                m_bModbus=true;
            else
                m_bModbus=false;
        }
/////

Enfin les define :

//////
#define SF_BAD_PARAMETERS                                        1

#define SF_CANNOT_OPEN_CAMERA                            2
.........................
..............
/////

Donc je dois creer une fonction de conversion du type FSRetVal vers int

dans le return de la fonction Init()

Merci de m'aider.

6 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
12 oct. 2006 à 09:10
Si je résume, tu faire une fonction du type "Convertir Machin vers Truc". C'est ça?
Inutile de poster un aussi gros code pour si peu...
Mais je pense que personne ne pourras t'aider car toi seul connait le type FSRetVal...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
12 oct. 2006 à 11:50
Bonjour Buno,

C'est exact, autant pour moi.
Le FSRetval s'agit de typedef enum qui ressemble à ca:






static






const



char
* FSRetVal_Names[FS_ERROR_NUMBER] = {

"FS_SUCCESS"
,


"FS_ERROR_LOW_MEMORY"
,


"FS_ERROR_BAD_PARAMETER"
,


"FS_ERROR_BAD_PARAMETER_IN_CONFIG_FILE"
,


"FS_ERROR_BAD_CONFIG_FORMAT"
,


"FS_ERROR_CANNOT_OPEN_FILE"
,


"FS_ERROR_CANNOT_CREATE_PROCESS"
,


"FS_ERROR_COMMUNICATION_LOST"
,


"FS_ERROR_DISK_FULL"
,


"FS_ERROR_CANNOT_EXECUTE"
,


"FS_ERROR_UNKNOWN"
,


"FS_ERROR_CAMERA_NOT_FOUND"
};









si je peux le convertir avec atoi(),  je pourrait avoir ceci :  












if
(m_bver ==0){      TRACE(


"SetConfigFilePath Hardware 1 failed : "
);         TRACE(


"%s\n"
,FSRetVal_Names[tmp]);



          int conv= atoi(tmp);

return
( conv);}


else

{    TRACE(




"SetConfigFilePathHardware 2 failed\n"
);     TRACE(


"%s\n"
,FSRetVal_Names[tmp]);



          int conv= atoi(tmp);
         conv = conv + 1;
         return ( conv);




Est-ce que c'est la bonne methode car la compilation genere des erreurs 'impossible de convertir le paramètre 1 de FSRetval en 'const char*' 

Comment convertir ?

Merci 

  
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
12 oct. 2006 à 12:25
Ce n'est pas un enum mais un tableau de chaines de caractères constantes...
Ce que tu peux faire dans ta fonction de conversion:
- rechercher le FSRetVal (passé en paramètre) dans ce tableau
- une fois trouvé, retourné son index dans le tableau.

Encore un fois, je ne vois pas l'utilité d'une telle fonction...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
12 oct. 2006 à 12:36
Mais je ne voit pas qu'il y a de tableau et ca deviandra plus complique en manipulant un tableau non ? 

J'ai fais une autre modif mais tjs pas bon: 

/////


string strrecupinit;





if
(m_bver==0)




{      TRACE(


"SetConfigFilePath Hardware 1 failed : " );




      TRACE("%s\n" ,FSRetVal_Names[tmp]);

          strrecupinit = (LPCTSTR)tmp;
          int conv= atoi(tmp.c_str());
          return (conv);
////////

erreur: la parti gauche de c_str doit avoir un class/struct/union

Vraiment je ne voit pas?
0

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

Posez votre question
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
12 oct. 2006 à 14:25
Je constate un souci: soit je ne comprends rien, soit tu ne maîtrises pas les notions de base (attention, ma remarque n'est pas méchante...).
Je te donne ce que j'ai compris:
Tu as une fonction init qui initialise ton système et qui te retourne des codes d'erreurs le cas échéant. pour l'instant, cette fonction te retourne un int. Or, cette fonction utilise d'autres fonctions qui retournent des FSRetVal. Pour garder la cohérence entre les retours de fonction, tu veux que Init() retourne un FSRetVal.

Je te propose le prototype suivant: FSRetVal CHardware::Init()

L'appel de ta fonction par d'autres ne changera pas mais si tu utilises le code retour, il te faudra changer ceci:
int tmp=m_MaCam.Init()
en
FSRetVal tmp=m_MaCam.Init()

Ai-je répondu à ta question?
NB: la prochaine fois, soit plus précis dans ta question s'il te plait

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
develdelphi Messages postés 97 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 20 avril 2009
15 oct. 2006 à 09:55
Oui,
Buno tu avais bien compris c'est moi qui ne fesait pas attention
j'ai fais comme tu m'as dit et ca  a fonctionne tres bien je vois mieux merci
mais ensuite j'ai du ajouter une struct a mon code pour passer une autre valeur

comme tu peux le voir dans mon dernier post intitule:
"Erreurs de compilation pour passage de valeurs par une struct"

Merci
0
Rejoignez-nous