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 :

Une section private recalcitrante


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut Une section private recalcitrante
    Bonjour,

    Lors de la déclaration de ma classe dans le .h, je rencontre un drôle de problème. Dans la section private, je ne peux déclarer que un seul objet privé .

    Si je déclare plusieurs objets, ca compile sans soucis, par contre l'application plante à son lancement (Le programme a généré des erreurs e tsera fermé par Windows... blablabla... voir le journal... blablabla).

    Voici ma classe Veilleur.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #ifndef Veilleur_h
    #define Veilleur_h
     
    #include "Configuration.h"
    #include "MailChecker.h"
    #include "MC.h"
     
    #include <QTextStream>
    #include <QSettings>
    #include <QObject>
    #include <QTimer>
     
     #include <iostream>
     #include <QWidget>
     
     class QAction;
     class QMenu;
     
    class Veilleur : public QObject
    {
    	Q_OBJECT	
     
    public:
        Veilleur();
    	void Demarrer();
    	void Arreter();
    	void Suspendre(int duree);  
        void Changer_frequence(int nouvelle_frequence);
     
    private slots:
    	void Essai_timer();
     
    private:
    	MailChecker mChecker;
    	QAction *Act_Tic;
    	//MC mon_mc;
    	//Configuration ma_config;
    };
     
    #endif
    Il s'agit d'une application QT4.2.2 compilée sous Windows avec MinGW.
    Dans la section private, si je laisse "QAction *Act_Tic;", alors l'application plantera.
    Il en va de même si je décommente la déclaration de "mon_mc" ou bien de "ma_config".

    J'avoue ne rien comprendre et ca me frustre...




    Pour plus d'informations, voici l'arborescence de mon programme :
    Dans le main je crée une Icone (classe personnelle) :
    Icone mon_icone;

    Ma classe Icone déclare un Veilleur (en private) :
    Veilleur mon_veilleur;

    Ma classe Veilleur est celle ci-dessus, et elle déclare un MailChecker (en private) :
    MailChecker mChecker;

    Ma classe MailChecker va utiliser une socket TCP :
    QTcpSocket *socket_r;



    Voili voilou... Je ne comprends rien du tout .
    Merci pour votre aide


    PS : D'ailleurs ca fait pareil si j'essaie d'ajouter quelque chose en public

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ca plante à quel moment ?

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Au lancement de l'application, immédiatement.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    1. Que signifie "slots" ?
    2. Es-tu sûr que tu n'as pas une erreur dans les constructeurs de tes objets privés ?
    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.

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Les slots sont gérés par le pré-compilateur de Qt, ils permettent de gérer des évènements entre objets.

    Mes constructeurs sont complètement vides, et à vrai dire je trouve étrange que ca me fasse ca maintenant... Quand j'ai construit la classe ca buggait pas :s

  6. #6
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    PS : D'ailleurs ca fait pareil si j'essaie d'ajouter quelque chose en public
    Le problème n'est pas un problème de droit d'accès. Je parie sur une classe mal initialisée.

    Solution => Mode debug, et c'est parti !

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Tu n'oublierais pas d'initialiser tondes fois ?

  8. #8
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    J'ai pas de mode debug .
    Non Ulmo je l'initialise dans le .cpp

  9. #9
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    J'ai pas de mode debug
    Ca m'étonnerais... Tous les compilateurs que je connais peuvent générer des informations de débogage. A moins que je sois passé à côté ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    pour ne pas poser trop de questions "à l'aveugle" pourrait-on voir le code cpp ?

  11. #11
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Le voici, en version réduite

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <QApplication>
    #include <QtGui>
     
    #include "Icone.h"
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);  
    			Icone mon_icone;
        return app.exec();
    }



    Icone.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #ifndef ICONE_H
    #define ICONE_H
     
     #include "Veilleur.h"
     
     #include <iostream>
     #include <QSystemTrayIcon>
     #include <QWidget>
     
     class QAction;
     class QMenu;
     
     class Icone : public QWidget
     {
         Q_OBJECT
     
     public:
         Icone();
     
     protected:
         [...]
     
     private slots:
         [...]
     
     private:
         // QActions and QMenus
         // [...]
     
         QSystemTrayIcon *trayIcon;
     
         Veilleur mon_veilleur;
     };
     
    #endif



    Icone.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	#include <QtGui>
     
    	 #include "Icone.h"
     
    	 Icone::Icone()
    	 {
    	     Creer_actions();  // Initialise the QActions
    	     Creer_menu(); // Initialise the QMenus
    	     Creer_TrayIcon(); // Initialise the trayicon and bind it the QMenus
    	 }



    Veilleur.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #ifndef Veilleur_h
    #define Veilleur_h
     
    #include "MailChecker.h"
     
    #include <QTextStream>
    #include <QObject>
    #include <QTimer>
     
     // Added in order to try to add a QAction
     #include <iostream>
     #include <QWidget> 
     class QAction;
     class QMenu;
     
    class Veilleur : public QObject
    {
    	Q_OBJECT	
     
    public:
        Veilleur();
    	[...]
     
    private slots:
    	[...]
     
    private:
    	MailChecker mChecker; 
    	//MailChecker mCheckersecond;  // Crash the application if uncommented
    	//QAction *Act_Tic; // Crash the application if uncommented
    	//QAction *Act_Ticlol; // Crash the application if uncommented
    };
    #endif




    Veilleur.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    #include <QApplication>
     
    #include "Veilleur.h"
     
    Veilleur::Veilleur() : QObject()
    {	
    }



    MailChecker.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #ifndef MailChecker_h
    #define MailChecker_h
     
    #include <QThread>
    #include <QTextStream>
    #include <QSettings>
    #include <QObject>
    #include <QTcpSocket>
     
    class QTcpSocket;
     
    class MailChecker : public QObject
    {
    	Q_OBJECT	
     
    public:
        MailChecker();
        [...]
     
    private slots:
        void afficher_erreur_socket(QAbstractSocket::SocketError socketError);
     
    private:
        [...]
     
        QTcpSocket *socket_r;
    };
     
    #endif



    MailChecker.cpp
    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
    #include <iostream>
     
    #include <QApplication>
    #include <QHostAddress>
    #include <QTcpSocket>
    #include <QStringList>
     
    #include "MailChecker.h"
     
     
    MailChecker::MailChecker() : QObject()
    {	
    	connect(socket_r, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(afficher_erreur_socket(QAbstractSocket::SocketError)));
    }
     
    void MailChecker::afficher_erreur_socket(QAbstractSocket::SocketError socketError)
    {	
          switch (socketError) 
          {
            case QAbstractSocket::RemoteHostClosedError:
                break;
            case QAbstractSocket::HostNotFoundError:
                std::cout << "\n ERREUR SOCKET : Host not found" << std::endl;
                break;
            case QAbstractSocket::ConnectionRefusedError:
                std::cout << "\n ERREUR SOCKET : Connection refused by peer" << std::endl;
                break;
            default:
                std::cout << "\n ERREUR SOCKET : \n" << socket_r->errorString().toStdString() << std::endl;
            }
    }

  12. #12
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Petit UP, car je ne trouve pas de solution ...
    Si quelqu'un a une diée, je suis preneur

  13. #13
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    Il faudrait que tu détermines exactement à quelle ligne ton programme plante. Et pour ça un debugger peut grandement t'aider.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 39
    Par défaut
    Bonjour Nyphel

    Je viens de tester un peu ton code et j'arrive à me débarrasser de la segfault en initialisant le QTcpSocket *socket_r dans le constructeur de la classe MailChecker.
    J'ai également pu décommenté les QAction * sans devoir les initialiser mais c'est parce que ton code réduit ne les utilise pas. Je ne sais pas si c'est suffisant pour ôter toute segfault de ton programme (personnellement, j'aurais préféré tester le code source non réduit) mais le principe suivant devrait t'aider : lorsqu'un de tes attributs n'est qu'un pointeur vers un objet d'un type donné, tu dois l'initialiser dans le constructeur de ton objet avant toute utilisation.

  15. #15
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    D'accord Dudule, je teste ca demain matin à la première heure .

    En fait ce que je faisait c'est que j'initialise la socket dans une fonction qui :
    - Initialise la socket
    - L'utilise pour se connecter au serveur
    - Emmet une requête précise
    - Ecoute la réponse
    - Ferme puis détruit la socket (deleteLater())

    Je vais donc tenter de faire comme tu me le conseilles, en l'initialisant dans la constructeur .


    Dans tous les cas, merci pour le conseil sur l'initialisation des pointeurs.
    J'avoue manquer d'expérience et de connaissances sur le C++, malheureusement je suis contraint dans le temps et ne peut pas vraiment m'attarder sur la consolidation de mes acquis



    PS : Je crois ne pas disposer de debugger parce que je développe avec QT4.2.2 sur Windows, avec le compilateur MSYS/MinGW. J'édite le code avec Eclipse et son plug-in C++.
    Je n'utilise pas le plug-in QtClipse qui permet d'avoir un IDE de développement Qt sous Eclipse car il semblait mal fonctionner sur ma plate-forme.
    MinGW dispose (du moins je crois) d'un débugger, mais lorsque j'utilise l'option -d (donnée par le man) sur mon make, rien de particulier ne semble se produire .

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 39
    Par défaut
    Citation Envoyé par Nyphel
    Je vais donc tenter de faire comme tu me le conseilles, en l'initialisant dans la constructeur .


    Dans tous les cas, merci pour le conseil sur l'initialisation des pointeurs..
    En fait, ce n'est nullement une obligation en soi. Ici c'est simplement nécessaire car le constructeur de MailChecker fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(socket_r, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(afficher_erreur_socket(QAbstractSocket::SocketError)));
    ... ce qui va utiliser l'objet pointé par socket_r (ouais, en Qt, les slots/signaux sont gérés en partie à l'éxécution). Si tu ne l'initialises pas, non seulement tu ne donnes pas vraiment d'objet "QTcpSocket" mais en plus, tu demandes au programme d'aller voir ce qu'il y a à une adresse mémoire farfelue, ton pointeur n'ayant pas été initialisé. Le résultat de cette demande, c'est bien sûr une segfault

  17. #17
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 157
    Par défaut
    Bonjour,

    Et bien merci beaucoup Dudule, cela fonctionne maintenant correctement et je comprends mieux quelle était mon erreur .

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

Discussions similaires

  1. [Concours] une section concours dans le forum
    Par Nocif dans le forum Etudes
    Réponses: 7
    Dernier message: 20/07/2005, 10h56
  2. [Crystal Report] Suppression d'une section
    Par franck.cvitrans dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 04/03/2005, 11h39
  3. [CR 8.5]Aff d'une section en fonction d'un champ paramètre ?
    Par caviar dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 16/02/2005, 16h15
  4. [CR] Supprimer une section
    Par Milou79 dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/09/2004, 11h51
  5. [CR 8.5] Supprimer une section à espaces
    Par franck.cvitrans dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 17/04/2004, 09h53

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