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

Discussion :

Segmentation fault

  1. #1
    Membre actif Avatar de rkade
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 48
    Par défaut Segmentation fault
    Bonjour à tous,

    Je suis très intéressé par la librairie Qt et j'ai donc décidé de commencer une petite application afin de m'entrainer avec cette librairie. Cependant, je sais pas si je m'y prend bien dans ma conception, car j'ai un soucis de segmentation fault lors de l'execution de mon application.

    Pour le moment, je fais deux vue qui me permettent de choisir une carte. La première vue permet de choisir la couleur, et ensuite la seconde vue permet de choisir la valeur de la carte.
    • Vue_Choisir_Couleur ( contient des boutons permettant de choisir la couleur de la carte )
    • Vue_Choisir_Valeur ( contient des boutons permettant de choisir la valeur de la carte )

    J'ai créé un controleur afin de gérer un peu tout cela.
    Voila ce que le controleur fait :
    A sa creation, il cree la premiere vue afin de choisir la couleur de la carte
    Il connecte les boutons de la premiere vue afin de récupérer la couleur de la carte, ensuite il créé la seconde vue qui permet de récupérer la valeur de la carte, puis connecte les boutons afin de récupérer sa valeur.

    Cependant, lors de l'execution, un comportement étrange apparait : La premiere vue ne pose aucun problèmes, ensuite la seconde vue se créé et la première est détruite, pas de problème, mais si je connecte les boutons de la seconde vue, il se passe (seulement quelques fois) une segmentation fault: 11, et quitte l'application instantanément.

    Lorsque je ne connecte pas les boutons de la seconde vue, pas de problème.

    Est-ce que je m'y prend mal ? Car je ne vois pas comment je peux modifier mon code.

    Si vous avez besoin de plus de précisions, n'hésitez pas.

    Merci

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Avec du code se serai beaucoup plus facile de t'aider.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  3. #3
    Membre actif Avatar de rkade
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 48
    Par défaut
    J'ai préférer cleaner mes appellations car c'était un peu n'importe quoi avant de vous poster mon code.

    N'hesitez pas à me dire ce que vous en pensé au passage.


    Class ControllerChooseCard:
    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 MODEL_CHOOSE_CARD_H
    #define MODEL_CHOOSE_CARD_H
     
    #include <QObject>
    #include <QApplication>
     
    #include "./h/ViewChooseColor.h"
    #include "./h/ViewChooseValue.h"
     
    class ControllerChooseCard : public QObject
    {
        Q_OBJECT
        private:
            QString color;
            QString value;
     
            ViewChooseColor * viewColor;
            ViewChooseValue * viewValue;
     
        public:
            void connectViewColor();
            void connectViewValue();
     
            ControllerChooseCard();
     
        public slots:
            void chooseValueSlot( QString );
            void chooseColorSlot( QString );
     
        signals:
            void chooseCardSignal( QString, QString );
     
    };
     
    #endif
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include "./h/ControllerChooseCard.h"
     
    ControllerChooseCard::ControllerChooseCard()
    {
        this->viewColor = new ViewChooseColor();
     
        this->color = "None";
        this->value = "None";
     
        this->connectViewColor();
    }
     
    /* CONNECT */
    void ControllerChooseCard::connectViewColor()
    {
        for( int i=0; i<4; i++ )
        {
            QObject::connect( this->viewColor->pushButtonsColors[i], SIGNAL( chooseSignal( QString ) ), this, SLOT( chooseColorSlot( QString ) ) );
        }
    }
     
    void ControllerChooseCard::connectViewValue()
    {
        for( int i=0; i<13; i++ )
        {
            QObject::connect( this->viewValue->pushButtonsValue[i], SIGNAL( chooseSignal( QString ) ), this, SLOT( chooseValueSlot( QString ) ) );
        }
    }
     
     
     
    /* SLOT */
    void ControllerChooseCard::chooseValueSlot( QString value_arg )
    {
        this->value = value_arg;
     
        emit( chooseCardSignal( this->color, this->value ) );
    }
     
    void ControllerChooseCard::chooseColorSlot( QString color_arg )
    {
        this->color = color_arg;
     
        this->viewValue = new ViewChooseValue();
     
        this->connectViewValue();
     
        delete( this->viewColor );
    }
    Class ViewChooseColor:
    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
    #ifndef VIEW_CHOOSE_H
    #define VIEW_CHOOSE_H
     
    #include <QWidget>
    #include <QPushButton>
    #include <QHBoxLayout>
    #include <QPixmap>
    #include <QObject>
     
     
    #include "./h/FullButton.h"
     
    class ViewChooseColor : public QWidget
    {
        public:
            QHBoxLayout * layout;
            FullButton * pushButtonsColors[4];
     
            ViewChooseColor();
    };
     
     
    #endif // VIEW_CHOOSE_H
    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
    32
    33
    34
    35
    #include "../h/ViewChooseColor.h"
     
    #include "../h/FullButton.h"
     
    #include <QString>
    #include <QPushButton>
    #include <QHBoxLayout>
    #include <QIcon>
    #include <QPixmap>
     
    ViewChooseColor::ViewChooseColor()
    {
    /* Properties of the window */
        this->setWindowTitle( "Choisir une carte " );
     
    /* Geometry */
        this->setFixedSize( 300, 100 );
     
    /* My 4 buttons */
        this->pushButtonsColors[0] = new FullButton( "./images/trefle.png", "Treffle", this );
        this->pushButtonsColors[1] = new FullButton( "./images/pique.png", "Pique", this );
        this->pushButtonsColors[2] = new FullButton( "./images/coeur.png", "Coeur", this );
        this->pushButtonsColors[3] = new FullButton( "./images/carreau.png", "Carreau", this );
     
    /* Layout */
        this->layout = new QHBoxLayout();
        this->layout->setContentsMargins( 0, 0, 0, 0 );
        this->layout->addWidget( this->pushButtonsColors[0] );
        this->layout->addWidget( this->pushButtonsColors[1] );
        this->layout->addWidget( this->pushButtonsColors[2] );
        this->layout->addWidget( this->pushButtonsColors[3] );
        this->setLayout( this->layout );
     
        this->show();
    }
    Class ViewChooseValue:
    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 VIEW_CHOOSE_VALUE_H
    #define VIEW_CHOOSE_VALUE_H
     
    #include <QObject>
    #include <QWidget>
    #include <QPushButton>
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    #include <QPixmap>
    #include <QString>
    #include <QPushButton>
    #include <QHBoxLayout>
    #include <QVBoxLayout>
    #include <QIcon>
    #include <QPixmap>
    #include <QApplication>
     
    #include "./h/FullButton.h"
     
    class ViewChooseValue : public QWidget
    {
        Q_OBJECT
        public:
            QVBoxLayout * layout;
            QHBoxLayout * layoutFirstRow;
            QHBoxLayout * layoutSecondRow;
            FullButton * pushButtonsValue[13];
     
            ViewChooseValue( );
    };
     
     
    #endif // VIEW_CHOOSE_VALUE_H
    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
    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
    #include "../h/ViewChooseValue.h"
     
    #include "../h/FullButton.h"
     
     
    ViewChooseValue::ViewChooseValue( )
    {
    /* Properties of the window */
        this->setWindowTitle( "Choisir une carte " );
     
    /* Geometry */
        this->setFixedSize( 700, 200 );
     
    /* Layout */
        this->layout = new QVBoxLayout();
        this->layoutFirstRow = new QHBoxLayout();
        this->layoutSecondRow = new QHBoxLayout();
        this->layout->setContentsMargins( 0, 0, 0, 0 );
     
    /* My 4 buttons */
        this->pushButtonsValue[0] = new FullButton( "./images/2.png", "2", this );
        this->pushButtonsValue[1] = new FullButton( "./images/3.png", "3", this );
        this->pushButtonsValue[2] = new FullButton( "./images/4.png", "4", this );
        this->pushButtonsValue[3] = new FullButton( "./images/5.png", "5", this );
        this->pushButtonsValue[4] = new FullButton( "./images/6.png", "6", this );
        this->pushButtonsValue[5] = new FullButton( "./images/7.png", "7", this );
        this->pushButtonsValue[6] = new FullButton( "./images/8.png", "8", this );
        this->pushButtonsValue[7] = new FullButton( "./images/9.png", "9", this );
        this->pushButtonsValue[8] = new FullButton( "./images/10.png", "10", this );
        this->pushButtonsValue[9] = new FullButton( "./images/V.png", "Valet", this );
        this->pushButtonsValue[10] = new FullButton( "./images/D.png", "Dame", this );
        this->pushButtonsValue[11] = new FullButton( "./images/K.png", "King", this );
        this->pushButtonsValue[12] = new FullButton( "./images/A.png", "As", this );
     
     
        this->layoutFirstRow->addWidget( this->pushButtonsValue[0] );
        this->layoutFirstRow->addWidget( this->pushButtonsValue[1] );
        this->layoutFirstRow->addWidget( this->pushButtonsValue[2] );
        this->layoutFirstRow->addWidget( this->pushButtonsValue[3] );
        this->layoutFirstRow->addWidget( this->pushButtonsValue[4] );
        this->layoutFirstRow->addWidget( this->pushButtonsValue[5] );
        this->layoutFirstRow->addWidget( this->pushButtonsValue[6] );
        this->layoutSecondRow->addWidget( this->pushButtonsValue[7] );
        this->layoutSecondRow->addWidget( this->pushButtonsValue[8] );
        this->layoutSecondRow->addWidget( this->pushButtonsValue[9] );
        this->layoutSecondRow->addWidget( this->pushButtonsValue[10] );
        this->layoutSecondRow->addWidget( this->pushButtonsValue[11] );
        this->layoutSecondRow->addWidget( this->pushButtonsValue[12] );
     
        this->layout->addLayout( this->layoutFirstRow );
        this->layout->addLayout( this->layoutSecondRow );
     
        this->setLayout( this->layout );
     
        this->show();
    }
    Class FullButton:
    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
    #ifndef FULLBUTTON_H
    #define FULLBUTTON_H
     
    #include <stdlib.h>
    #include <iostream>
     
    #include <QObject>
    #include <QWidget>
    #include <QPushButton>
    #include <QString>
    #include <QPixmap>
    #include <QPainter>
    #include <QSize>
    #include <QIcon>
    #include <QApplication>
     
    #include "./h/FullButton.h"
     
    class FullButton : public QPushButton
    {
        Q_OBJECT
        private:
            QString icon_path;
            QString name;
     
        public:
            FullButton( const QString &, const QString & = "FullButton", QWidget * = 0 );
            void paintEvent( QPaintEvent *pEvent );
     
    //SLOTS
        public slots:
            void chooseSlot( );
     
        signals:
            void chooseSignal( QString );
    };
     
    #endif // FULLBUTTON_H
    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
     
    #include "./h/FullButton.h"
     
     
     
    FullButton::FullButton( const QString & icon_arg, const QString & text, QWidget * parent ) : QPushButton( QIcon( icon_arg ), text, parent )
    {
        this->setFixedSize( 75, 100 );
        this->icon_path = icon_arg;
        this->name = text;
     
        QObject::connect( this, SIGNAL( clicked() ), this, SLOT( chooseSlot( ) ) );
    }
     
    void FullButton::paintEvent( QPaintEvent *pEvent )
    {
        QPainter painter( this );
        painter.drawImage( QRect( 0, 0, 75, 100 ), QImage( this->icon_path ) );
    }
     
    void FullButton::chooseSlot( )
    {
        emit( chooseSignal( this->name ) );
    }

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 258
    Par défaut prob segfault
    RKade,

    Je suis pas un pro et ne suis pas sûr avec mes connaissances de pouvoir debugguer ton code ( débutant aussi ), mais moi à chaque fois que ça m'est arrivé, c'est que j'essayais d'appeler un objet qui n'était plus référencé ( exemple : appel d'un widget non encore crée, ou un pointeur non initialisé,pointant donc sur une adresse aléatoire )

    En espérant t'avoir aidé.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre actif Avatar de rkade
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2011
    Messages : 48
    Par défaut
    Yes ! Tout à fait d'accord avec toi, et tu as raison, il s'agit bien d'un problème de vouloir connecter mes widget avant de les avoir créer.

    Après avoir cleaner un peu mon code, je n'ai plus, jusqu'à maintenant, de segmentation fault. Espérons que ca continue ^^

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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