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

MFC Discussion :

Récupèrer l'adresse d'un objet se trouvant dans le fichier de l'application


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut Récupèrer l'adresse d'un objet se trouvant dans le fichier de l'application
    Bonjour,

    Le projet se nomme Module_test1 c'est un application MFC smart device.

    Je souhaite récupèrer l'adresse d'un objet nommé "serie" qui est déclaré dans le Module_test1.h et l'envoyer dans mon Module_test1View.cpp

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Module_test1.h : fichier d'en-tête principal pour l'application Module_test1
     
    class CModule_test1App : public CWinApp
    {
    public:
        CModule_test1App();
     
                 ....
    public:
        cl_Bluetooth serie;
     
        DECLARE_MESSAGE_MAP()
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // Module_test1View.cpp : implémentation de la classe CModule_test1View
    
    void CModule_test1View::OnBnClickedButton1()
    {
    char *recupTRAME=pApp->serie.Lecture();  //pApp est le pointeur sur le fichier Module_test1 mais il m'affiche une erreur lorsque je clique sur lecture gwes.exe
     LPCTSTR tmp=(LPCTSTR)recupTRAME;
         AfficheTrame.AddString(tmp);
    
    }
    Quelle fonction peut fonctionner ?

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    il y a erreur parce que ton pointeur pApp ne doit pas être valide ...
    ton code ne permet pas de voir son initialisaton...
    qui devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pApp=static_cast<CModule_test1App *>(AfxGetApp());
    ou alors le probléme vient de ton utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *recupTRAME=pApp->serie.Lecture()
    vu que tu utilises un char * en retour, l'adresse retournée ne doit pas être située dans la pile sinon boum (plus loin)...
    de toute façon plein de bug possible dans ce code pas terrible..
    la chaine retournée se termine par un \0 ? sinon boum dans AddString .
    en conclusion les char * c'est mal si on ne maitrise pas la chose..

  3. #3
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut Un peu de précision...
    Merci Farscape, ta fonction static_cast<CModule_test1App *>(AfxGetApp()) je l'utilise dans mon constucteur de Module_test1View car j'ai déclaré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Module_test1View.h : interface de la classe CModule_test1View
                        ...
    class CModule_test1View : public CFormView
    {
                   ...
    public:
    	CModule_test1App *pApp;
    Par contre je ne comprend pas pourquoi le type char* pose problème car c'est quand même un type de base du C++. Maintenant il me met plus l'erreur gwes.exe mais il m'affiche rien dans le listbox.

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par gueulederack
    Par contre je ne comprend pas pourquoi le type char* pose problème car c'est quand même un type de base du C++.
    Citation Envoyé par Farscape
    l'adresse retournée ne doit pas être située dans la pile sinon boum
    ce n'est pas une question de type mais d'utilisation, manipuler des char * est délicat si on est pas habitué à écrire du C, et les pièges sont nombreux ,j'en ai cité deux dans mon post précédent.
    il faudrait voir l'implémentation de ta fonction Lecture().

  5. #5
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut la méthode Lecture()
    Je te montre de suite ma classe Cl_Bluetooth

    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
    class cl_Bluetooth : public CWnd
    {
    	DECLARE_DYNAMIC(cl_Bluetooth)
     
    public:
    	cl_Bluetooth();
    	~cl_Bluetooth();
        char* Lecture (void);
        void modifPARAM (char *Port,int Brate);
     
    private:
       HANDLE hcomm;
       LPDCB serie;
       OVERLAPPED over;
     
    protected:
    	DECLARE_MESSAGE_MAP()
     
    };
    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
    #include "stdafx.h"
    #include "Module_test1.h"
    #include "cl_Bluetooth.h"
    
    
    // cl_Bluetooth
    
    IMPLEMENT_DYNAMIC(cl_Bluetooth, CWnd)
    //---------------------------------------------------------------------------
    /*                               Partie PDA                                */
    /*                                                                         */
    /*                                                                         */
    /*                        Définition des méthodes de Bluetooth             */
    //---------------------------------------------------------------------------
    cl_Bluetooth::cl_Bluetooth()
    {char *Port=new char (5);
     serie=new DCB();
     int vitesse;
     strcpy(Port,"COM1");
     vitesse=4800;
     modifPARAM (Port,vitesse);
    }
    //-------------------------------------------------------------------------
    cl_Bluetooth::~cl_Bluetooth()
    {		/* Destructeur */
    bool test;
     test=PurgeComm (hcomm,PURGE_RXCLEAR);
     if (test==true)
       {test=CloseHandle (hcomm); //fermeture du port
       }
     else
       {MessageBox(TEXT("Impossible de vider le port com"),TEXT("Erreur #003"),MB_ICONSTOP);
       }
    }
    //-----------------------------------------------------------------------------
    char* cl_Bluetooth::Lecture ()
    /* Lecture des données sur le port */
    {bool test;
     unsigned long pt=0;
     char chaine[100];
     test=ReadFile(hcomm,&chaine,82,&pt,&over); //lecture du port série
     strcat (chaine,"\0");
     if (test==false)
       {MessageBox(TEXT("Impossible de lire sur le port com"),TEXT("Erreur #004"),MB_ICONSTOP);
       }
     PurgeComm (hcomm,PURGE_RXCLEAR); // vide le buffer du port
     return chaine; //on retourne la trame NMEA
    }
    //---------------------------------------------------------------------------
    void cl_Bluetooth::modifPARAM (char *Port,int vitesse)
    /* Modification des paramètres du port série */
    {LPWSTR wch;
     strcat(Port,":");
     int Size = MultiByteToWideChar (CP_ACP, 0, Port, -1, NULL, 0);
     wch = new WCHAR[Size];
     MultiByteToWideChar (CP_ACP, 0, Port, -1, wch, Size); 
    
     bool test;
     hcomm=CreateFile(wch,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); //ouverture du port sélectionné
     if(hcomm==INVALID_HANDLE_VALUE) 
      {MessageBox(TEXT("Impossible d'ouvrire le port choisi"),TEXT("Erreur #001"),MB_ICONSTOP);
      }
     GetCommState (hcomm,serie); //lecture des paramètre de configuration du port
     serie->BaudRate=vitesse;
     serie->ByteSize=8;
     serie->Parity=NOPARITY;
     serie->StopBits=0;
     test=SetCommState (hcomm,serie); //fin de la configuration
     if (test==false)
       {MessageBox(TEXT("Impossible d'ouvrire le port choisi"),TEXT("Erreur #002"),MB_ICONSTOP);
       }
      PurgeComm (hcomm,PURGE_RXCLEAR);  //vider le buffer
    }
    De plus j'ai l'habitude d'utiliser les char* car j'ai débuter laz prog avec le llangage C avec devcpp. Mais c'est vrai que rien n'est automatique. ^^

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    oué c'est bien ce que je disais...
    ta variable char chaine[100]; est bien dans la pile.
    a la sortie d'une fonction les variables dans la pile sont nettoyées,
    ce sont les base du C ça...
    de toute façon ton code est truffé de bugs, comme le
    strcat (chaine,"\0");
    et je ne suis pas allé plus loin dans la lecture..


  7. #7
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut Je me suis rendu compte de ma grosse c*** .
    Dslée farscape je viens de voir mon erreur. Je dois avouer que j'ai pas réfléchi lopngtemps sur la classe cl_Bluetooth car je me concentrais surtout sur la compréhension du fonctionnement d'un projet MFC. Je te montre ma nouvelle méthode de Lecture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void cl_Bluetooth::Lecture (char *chaine)
    /* Lecture des données sur le port */
    {bool test;
     unsigned long pt=0;
     test=ReadFile(hcomm,&chaine,82,&pt,&over); //lecture du port série
     if (test==false)
       {MessageBox(TEXT("Impossible de lire sur le port com"),TEXT("Erreur #004"),MB_ICONSTOP);
       }
     PurgeComm (hcomm,PURGE_RXCLEAR); // vide le buffer du port
    }
    Ainsi que son appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void CModule_test1View::OnBnClickedButton1()
    {
     char *recupTRAME=new char (85);
     pApp->serie.Lecture(recupTRAME);
     LPCTSTR tmp=(LPCTSTR)recupTRAME;
     AfficheTrame.AddString(tmp);
    }

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    tu as toujours le bug de l' \0 a la fin de la chaine...
    AddString s'attend a une chaine se terminant par \0.
    et tu as oublié de liberer la memoire allouée.

  9. #9
    Membre éclairé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 246
    Par défaut rep
    Exact j'ai rajouté ' \0 ' après l'appel du ReadFile, et j'ai désalloué mes chaines.

    Bon faut quer j'aille en physique je testerais ce soir.

    Encore merci

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *recupTRAME=new char (85);
     pApp->serie.Lecture(recupTRAME);
     LPCTSTR tmp=(LPCTSTR)recupTRAME
    Très mauvais, ça:
    1. Il faut des crochets et non des parenthèses (là, tu alloues UN char qui a la valeur 85)
    2. On ne caste jamais char* en TCHAR* : Dans ce sens, passe par une CString, ça marche même pour les vieilles versions de MFC.
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/02/2013, 16h09
  2. Récupérer un objet se trouvant dans une autre fonction
    Par Shinochi dans le forum Débuter
    Réponses: 4
    Dernier message: 03/10/2010, 18h30
  3. Réponses: 2
    Dernier message: 16/07/2007, 14h13
  4. Réponses: 7
    Dernier message: 06/01/2007, 20h16
  5. Monter une partition se trouvant dans un fichier
    Par Celelibi dans le forum Administration système
    Réponses: 3
    Dernier message: 02/04/2006, 18h56

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