begin process at 2012 05 28 20:02:00
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

MFC

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mercredi 11 octobre 2006 à 22:29:12 | Par défaut Fonction de conversion d'un type specifique vers un int en retour de fonction

develdelphi


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.


jeudi 12 octobre 2006 à 09:10:20 | Re : Par défaut Fonction de conversion d'un type specifique vers un int en retour de fonction

buno

Administrateur CodeS-SourceS
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
jeudi 12 octobre 2006 à 11:50:07 | Re : Par défaut Fonction de conversion d'un type specifique vers un int en retour de fonction

develdelphi


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 


jeudi 12 octobre 2006 à 12:25:16 | Re : Par défaut Fonction de conversion d'un type specifique vers un int en retour de fonction

buno

Administrateur CodeS-SourceS
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
jeudi 12 octobre 2006 à 12:36:11 | Re : Par défaut Fonction de conversion d'un type specifique vers un int en retour de fonction

develdelphi

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?

jeudi 12 octobre 2006 à 14:25:37 | Re : Par défaut Fonction de conversion d'un type specifique vers un int en retour de fonction

buno

Administrateur CodeS-SourceS
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
dimanche 15 octobre 2006 à 09:55:22 | Re : Par défaut Fonction de conversion d'un type specifique vers un int en retour de fonction

develdelphi

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



Cette discussion est classée dans : fonction, tmp, init, hardware, strdatalist


Répondre à ce message

Sujets en rapport avec ce message

converion d'un type specifique vers un entier lors du retour d'une fonction [ par develdelphi ] Bonjour, Voila comme le titre le dit bien, je veux convertir un type donne ( FSRetval ) vers un type ( int ) lors du retour vers la fonction. Voici l gcc, prob de compilation [ par Metrox ] 'lut all, je tourne ss une debian (knoppix, pr etre precis), et j'essaie de compiler un truc tt bete, mais il me sort une erreur...que faire?!?CODE(es REPETITION D'UNE FONCTION .... [ par Leparasite ] salut a tous .....voila c simple j'aimerai qu cette fonction ce repete a l'infini : FILE *fp,*fp2;char tmp[256]; fp=fopen("c:\\test.txt","rb");fp2=fop Affichage de texte sur Zone de Control sous conditions [ par develdelphi ] Bonjour,Voila j'ai un grand programme Visual C++ qui au demarrage fait des initialisations sur differents parametres.J'ai donc un Dialog  (IDD_SYSTEME Passage de parametres avec concatenation a une fonction qui attend string [ par develdelphi ] Bonjour,Je vais vous enoncer mon probleme et je tiens a vous remercier de prendre le temps de lire tous ce code. Je suis dans la fonction OnDestroy() Adaptation d'une fonction en vue de retourner deux v [ par develdelphi ] Bonjour, Je voudrais afficher dans une List Box, les problèmes rencontrés lors de l'initialisationsde caméras (Hardware). Au depart ma fonction affich fonction attente en ms [ par windowsfashion ] Bonjour, Je suis entrain de creer un soft pour controller des servomoteurs ( 8 ) et il me faudrait une fonction qui "fait attendre" de 0.8ms a 2.5ms.. Thread paramètre [ par nicompx ] Salut, Je démarre plusieurs thread qui exécute une fonction. Cette fonction reçoit en paramètre une structure. Si je passe l'adresse de la structure e y a-t-il une fonction de système windows.. [ par magico2006 ] Bonjour,J'appelle une fonction MainMpeg(argc, argv) de un'autre programme..., et sa ne marche pas, y a-t-il une fonction de système windows p Prologue stdcall [ par juju12 ] Bonsoir;Dans le but d'optimiser la rapidité d'appel de fonction dnas un prog, je veux écrire mes propres prologue-épilogue (__declspec(naked)) tout en


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales