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

C++ Discussion :

Récupérer données structure d'une autre classe


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 18
    Points
    18
    Par défaut Récupérer données structure d'une autre classe
    Bonjour à tous !!!

    J'ai un soucis au niveau de la récupération des données d'une structure déclarée dans une autre classe ...

    J'ai créé une structure dans une classe (RS232_Config) avec le numéro du port com, baudrate, bits de données, bits de stop, controle de flux, timeout etc...

    J'aimerais la récupérer dans une autre classe (RS232_Com) pour pouvoir lancer la communication en récupérant les paramètres de la structure...

    Il me semble que j'ai tout bien fait mais je n'arrive pas à récupérer les valeurs des données de la structure ... Je pense que je dois taper dans la mauvaise case mémoire ...

    J'ai rajouter des "cout" pour vérifier si je récupère bien les valeurs sauf que je récupère que des 0 à part pour la 1ère valeur (nom du port), j'obtiens les valeurs suivantes :
    Port Com # : 197008
    Transmission speed : 193440864
    Data length is about 0 bits
    Parity is 0
    Stop bit is about 196615 bits
    Flow Control is 17301998
    Time out is about 1 msec
    alors que les paramètres sont les suivants:
    Port Com # : 1
    Transmission speed : 4800
    Data length is about 5 bits
    Parity is 0
    Stop bit is about 1 bits
    Flow Control is 0
    Time out is about 50 msec

    Si vous voulez les codes les voila :
    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
    // Classe ConfigRS232
    #ifndef CONFIGRS232_H
    #define CONFIGRS232_H
     
    #include <QtGui>
    #include <QWidget>
    #include <QExtSerialPort.h>
     
     
    // Port com configuration structure
    struct PortConfigSet{
        int PortCom;
        int BaudRate;
        int DataBits;
        int Parity;
        int StopBits;
        int FlowControl;
        int TimeOut;
    };
     
    class ConfigRS232: public QWidget
    {
        Q_OBJECT
     
        QComboBox *portCom;
        QComboBox *baudRate;
        QComboBox *dataLength;
        QComboBox *parity;
        QComboBox *stopBit;
        QComboBox *flowControl;
        QSpinBox  *timeOut;
     
        QPushButton *saveConfigButton;
     
    public:
        ConfigRS232(QWidget *parent = 0); // Constructor
        struct PortConfigSet* GetSerialStruct() {return(pt_SerialPort);} // Function to get param in other class
        void Enum_Ports();
     
    protected:
        struct PortConfigSet *pt_SerialPort;
        //Pt_PortConfig pt_SerialPort; // Variable
     
    public slots:
        void SaveConfigParameters();
    };
     
    #endif // CONFIGRS232_H
    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
    // Code du fichier Config_RS232.cpp
    [...]
    pt_SerialPort->PortCom      = portCom->itemData(portCom->currentIndex()).toInt();
        pt_SerialPort->BaudRate     = baudRate->itemData(baudRate->currentIndex()).toInt();
        pt_SerialPort->DataBits     = dataLength->itemData(dataLength->currentIndex()).toInt();
        pt_SerialPort->Parity       = parity->itemData(parity->currentIndex()).toInt();
        pt_SerialPort->StopBits     = stopBit->itemData(stopBit->currentIndex()).toInt();
        pt_SerialPort->FlowControl  = flowControl->itemData(flowControl->currentIndex()).toInt();
        pt_SerialPort->TimeOut      = timeOut->value();
     
        cout << endl << "Port Com # : " << pt_SerialPort->PortCom << endl;
        cout << "Transmission speed : " << pt_SerialPort->BaudRate << endl;
        cout << "Data length is about " << pt_SerialPort->DataBits << " bits" << endl;
        cout << "Parity is "            << pt_SerialPort->Parity << endl;
        cout << "Stop bit is about "    << pt_SerialPort->StopBits << " bits" << endl;
        cout << "Flow Control is "      << pt_SerialPort->FlowControl << endl;
        cout << "Time out is about "    << pt_SerialPort->TimeOut << " msec" << endl;
    [...]

    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
    //Code du header RS232_Com.h
    #ifndef RS232_COM_H
    #define RS232_COM_H
     
    #include <configrs232.h>
    #include <QExtSerialPort.h>
     
    class RS232_Com : public ConfigRS232
    {
     
    public:
        RS232_Com();
     
    private:
        struct PortConfigSet* SettingPort;
     
    };
     
    #endif // RS232_COM_H
    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
    // Code du fichier RS232_Com.cpp
    #include "rs232_com.h"
    #include <stdio.h>
    #include <iostream>
    using namespace std;
     
    RS232_Com::RS232_Com()
    {
        SettingPort = GetSerialStruct();
     
        cout << endl << "Port Com # : " << SettingPort->PortCom << endl;
        cout << "Transmission speed : " << SettingPort->BaudRate << endl;
        cout << "Data length is about " << SettingPort->DataBits << " bits" << endl;
        cout << "Parity is "            << SettingPort->Parity << endl;
        cout << "Stop bit is about "    << SettingPort->StopBits << " bits" << endl;
        cout << "Flow Control is "      << SettingPort->FlowControl << endl;
        cout << "Time out is about "    << SettingPort->TimeOut << " msec" << endl;
    }

    PS: j'ai du mal avec les pointeurs de structures donc si au passage vous pouvez m'expliquer brièvement ça pourrait m'aider ^^
    PPS: je pense qu'il manque un malloc du pointeur de structure, j'ai déjà essayé mais sans succès... peut être que je l'ai mal fait...


    Je vous remercie par avance !

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    En C++ on utilise pas malloc/free mais new et delete.

    Ensuite RS232_Com hérite de ConfigRS232, il possède donc déjà les attribut et méthodes publique et protected de ConfigRS232.

    En C++, on a plus besoin du mot clé struct pour déclarer une variable.
    Une structure est une classe dont tous les membres ont par défaut une visibilité publique au lieu d'avoir une visibilité privée.

    Ensuite tu n'alloue jamais l'espace nécessaire à ta structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ConfigRS232::ConfigRS232(QWidget *parent = 0) : SettingPort(new PortConfigSet)
    {
    }
    virtual ConfigRS232::~ConfigRS232()
    {
          delete SettingPort;
    }
    Ne pas oublier que toute classe sujet à la dérivation doit avoir un destructeur virtuel.

  3. #3
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Attention Neckara à ta coquille : tu as oublié le ~ du destructeur. Du reste, le mot clé virtual n'apparaît pas dans une implémentation, seulement dans le header.

    Il est vrai qu'il convient d'utiliser new et delete. Ici, tu n'as jamais alloué de mémoire, ta structure n'existe donc pas, tu as juste un pointeur que tu as probablement oublié d'initialiser et qui pointe n'importe où.

    Je ne vois pas pourquoi tu veux utiliser un pointeur ? C'est une structure simple, autant laisser le membre tel quel, comme ça tu as moins de problèmes de mémoire à gérer. Pour l'accesseur, tu renvoies une référence constante. Meilleures perfos, meilleure sécurité du code.

    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
    // Classe ConfigRS232
    #ifndef CONFIGRS232_H
    #define CONFIGRS232_H
     
    #include <QtGui>
    #include <QWidget>
    #include <QExtSerialPort.h>
     
     
    // Port com configuration structure
    struct PortConfigSet{
        int PortCom;
        int BaudRate;
        int DataBits;
        int Parity;
        int StopBits;
        int FlowControl;
        int TimeOut;
    };
     
    class ConfigRS232: public QWidget
    {
        Q_OBJECT
     
        QComboBox *portCom;
        QComboBox *baudRate;
        QComboBox *dataLength;
        QComboBox *parity;
        QComboBox *stopBit;
        QComboBox *flowControl;
        QSpinBox  *timeOut;
     
        QPushButton *saveConfigButton;
     
    public:
        ConfigRS232(QWidget *parent = 0); // Constructor
        virtual ~ConfigRS232();
        PortConfigSet const & GetSerialStruct() {return m_SerialPort;} // Function to get param in other class
        void Enum_Ports();
     
    protected:
        PortConfigSet m_SerialPort;
     
    public:
        void SaveConfigParameters();
    };
     
    #endif // CONFIGRS232_H
    A utiliser comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << pt_Config->GetSerialStruct().PortCom << std::endl;
    Je t'invite à lire la FAQ qui traite des accesseurs: ici et ici.
    Find me on github

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Attention Neckara à ta coquille : tu as oublié le ~ du destructeur. Du reste, le mot clé virtual n'apparaît pas dans une implémentation, seulement dans le header.
    Merci pour cette correction j'étais un peu distrait

  5. #5
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    Je vous remercie tous pour vos réponses mais je pense avoir élucidé le problème ... En fait ma classe ConfigRS232 (qui instancie RS232_Com) est instanciée par une autre classe ConfigDialog. Cette dernière permet de configurer les différents ports de communication (RS232 et Ethernet)... SAUF QUE cette classe (ConfigDialog) est une fenêtre pop-up de configuration donc en fait, lorsque j'ai tout paramétré, je suis obligé de fermer cette fenêtre et je pense que toutes les données membres inhérentes à toutes ces classes sont automatiquement détruites... Je pense que c'est pour ça que je ne peux pas accéder à ma structure.

    Le problème doit certainement venir de mon architecture tout simplement... Enfin je pense.

    Donc l'idée que j'ai c'est de faire remonter les paramètres de configuration le plus "haut" possible pour pouvoir les sauvegarder et les utiliser par la suite...

    Je pense aussi que l'archi que j'ai définie a mal été établie car logiquement RS232_Com doit ouvrir le port com et lancer l'émission ou la réception, elle ne peut donc pas dépendre de la classe de configuration mais plutot de la classe où je souhaite lancer la communication...

    Je sais pas si je suis clair mais je ne sais pas ce que vous en pensez, il faudrait que je vous montre peut être mon architecture pour que ce soit plus clair si vous le désirez...

    Ceci dit, je vous remercie pour votre réactivité !
    Bonne journée

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Il y a justement une discussion et un article à ce sujet.

    Citation Envoyé par lowee31 Voir le message
    Je sais pas si je suis clair mais je ne sais pas ce que vous en pensez, il faudrait que je vous montre peut être mon architecture pour que ce soit plus clair si vous le désirez...
    Fais nous un schéma UML et met là dans un nouveau post, on regardera
    Find me on github

  7. #7
    Membre à l'essai
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Apprenti Ingénieur
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 35
    Points : 18
    Points
    18
    Par défaut
    voici le lien vers le nouveau post, je ne sais pas s'il est bien placé mais c'est l'endroit qui me paraissait le plus approprié ...

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

Discussions similaires

  1. Récupérer contenu JTextField dans une autre classe
    Par gregenforce7 dans le forum Débuter
    Réponses: 2
    Dernier message: 14/02/2014, 22h25
  2. Récupérer une donnée a partir d'une autre classe
    Par GagDusH dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 01/01/2013, 18h46
  3. Réponses: 10
    Dernier message: 17/11/2006, 15h20
  4. Récupérer une variable d'une autre classe
    Par Chris33 dans le forum Général Python
    Réponses: 2
    Dernier message: 06/12/2005, 10h45

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