1. #1
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 169
    Points : 74
    Points
    74

    Par défaut ordonencement de déclaration

    Bonjour à tous,
    j'ai le programme suivant :

    .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
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QWidget>
    #include <QPushButton>
     
    #define BUFSIZE 256
     
    class MainWindow : public QWidget
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    private :
        QPushButton *boutton;
        char *outputBuffer;
        bool *bypass;
     
    private slots :
        void buttonClicked();
     
    };
     
    #endif // MAINWINDOW_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
    #include "mainwindow.h"
    #include <QGridLayout>
    #include <QDebug>
     
    mainWindow::MainWindow(QWidget *parent) :
        QWidget(parent)
    {
        qDebug() << "Well hello there!";
        boutton = new QPushButton("Click here");
        QGridLayout *layout = new QGridLayout();
     
        layout->addWidget(boutton, 0, 0, 2, 2);
        setLayout(layout);
     
        *bypass = false;
        outputBuffer = new char[BUFSIZE];
     
        connect(boutton, SIGNAL(clicked(bool)), this, SLOT(buttonClicked()));
     
    }
     
    void MainWindow::buttonClicked()
    {
        qDebug()<<"You just clicked";
    }
     
    MainWindow::~MainWindow()
    {
        qDebug() << "Job done! see ya later!";
    }
    ce programme marche très bien sauf si j'inverse dans le .h les déclaration suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private :
         // compile et fonctionne
        char *outputBuffer;
        bool *bypass;
     
        //Compile et crash
        private :
        bool *bypass;
        char *outputBuffer;
    j'ai beau me creuser la tête, je ne comprends pas ce problème;
    j'ai placé ce message ici plutôt qu'en Qt, parce les classes impliquée sont standart. mais si c'est spécifique à Qt, je déplacerai le problème.
    merci d'avance pour votre aide.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 583
    Points : 9 408
    Points
    9 408
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    Prend ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int *pointer;
    *pointer = 42;
    Que penses-tu de ce code ? Si tu réponds correctement à cette question, tu auras une idée de ton problème

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 169
    Points : 74
    Points
    74

    Par défaut

    je suis sur qu'il y a un piège
    initialise un pointer sur int et
    assigne à la zone mémoire dont l'adresse est la valeur 42.
    si j'ai bon je vois toujours pas le problème
    ceci dit le problème se présente même une fois l'assigniation dans le .cpp commenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *bypass = false;
        outputBuffer = new char[BUFSIZE];

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    4 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 4 705
    Points : 19 395
    Points
    19 395

    Par défaut

    Ton truc marche par chance, tu assignes false dans un pointeur non alloué et qui pointe n'importe où.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    avril 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2007
    Messages : 169
    Points : 74
    Points
    74

    Par défaut

    oui effectivement j'ai mal lu mon bouquin.....
    merci pour votre aide

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    5 022
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : juin 2007
    Messages : 5 022
    Points : 16 812
    Points
    16 812

    Par défaut

    Citation Envoyé par Zhitoune Voir le message
    je suis sur qu'il y a un piège
    initialise un pointer sur int et
    assigne à la zone mémoire dont l'adresse est la valeur 42.
    si j'ai bon je vois toujours pas le problème
    ceci dit le problème se présente même une fois l'assigniation dans le .cpp commenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *bypass = false;
        outputBuffer = new char[BUFSIZE];
    En fait, pas du tout.
    • int *pointer; défini un pointeur vers entier mais ne l'initialise pas. (Peut se lire "Soit de type int ce que désigne pointer.")
    • *pointer = 42; affecte 42 à l'entier pointé par pointer. (Peut se lire "ce que désigne pointer reçoit la valeur de 42.")

    A aucun moment on ne dit qui est désigné. Donc, on écrit 42 dans la case mémoire désignée par l'adresse définit par la valeur arbitraire de pointer.
    Cela peut provoquer une erreur de segmentation, ou tout simplement écraser n'importe quoi.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Déclaration multiple d'une fonction
    Par Julien C. dans le forum Langage
    Réponses: 2
    Dernier message: 17/06/2003, 17h38
  2. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 11h17
  3. Une déclaration pour la survie du jeu vidéo en France
    Par Freakazoid dans le forum DirectX
    Réponses: 1
    Dernier message: 30/10/2002, 15h31
  4. Réponses: 2
    Dernier message: 27/05/2002, 20h46
  5. Réponses: 8
    Dernier message: 17/05/2002, 10h08

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