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 :

Problème de getters, plantage mémoire

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut Problème de getters, plantage mémoire
    Bonjour,

    Lors du débugage, je m'aperçois qu'il y un problème pour l'utilisation de getters.

    Voici mon code :

    MainWindow.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
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
            MainWindow(QWidget *parent = 0);
     
            int getNbPoints() ;
            double getTableauXParfait(int) ;
            double getTableauYParfait(int) ;
            double getTableauZParfait(int) ;
            double getTableauXDefaut(int) ;
            double getTableauYDefaut(int) ;
            double getTableauZDefaut(int) ;
            double getTableauErreurX(int) ;
            double getTableauErreurY(int) ;
            double getTableauErreurZ(int) ;
            double getTableauErreurTotale(int) ;
    MainWindow.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
    double MainWindow::getTableauXParfait(int i)  { return *(tableauXParfait+i); }
    double MainWindow::getTableauYParfait(int i)  { return *(tableauYParfait+i); }
    double MainWindow::getTableauZParfait(int i)  { return *(tableauZParfait+i); }
    double MainWindow::getTableauXDefaut(int i)  { return *(tableauXDefaut+i); }
    double MainWindow::getTableauYDefaut(int i)  { return *(tableauYDefaut+i); }
    double MainWindow::getTableauZDefaut(int i)  { return *(tableauZDefaut+i); }
    double MainWindow::getTableauErreurX(int i)  { return *(tableauErreurX+i); }
    double MainWindow::getTableauErreurY(int i)  { return *(tableauErreurY+i); }
    double MainWindow::getTableauErreurZ(int i)  { return *(tableauErreurZ+i); }
    double MainWindow::getTableauErreurTotale(int i)  { return *(tableauErreurTotale+i);} 
     
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
    {
        setFixedSize(820, 820);
        uiMW.setupUi(this);
     
        fic = new Fichiers(this);
        point = new Point(this);
     
        graphique = new Graphique(this);
    ...
    }
     
    void MainWindow::calculer()
    {
    graphique->dessinerCourbesParfaiteDefaut();
    graphique->show();
    }
    Graphique.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 GRAPHIQUE_H
    #define GRAPHIQUE_H
     
    #include "qwt_plot.h"
    #include <qwt_plot_curve.h>
    #include <qwt_plot_zoomer.h>
    #include <qwt_plot_grid.h>
    #include "maFenetre.h"
    #include "ihm.h"
    #include "ihmgraphique.h"
     
    class MainWindow;
     
    class Graphique: public QDialog
    {
        Q_OBJECT
     
        private:
     
            QwtPlotCurve *courbeParfaite;
            QwtPlotCurve *courbeDefaut;
            QwtPlotGrid grille;
            QwtPlotZoomer *myZoomer;
     
            Ui::ihmGraphique uigraphe;
            MainWindow *mw;
     
        public:
            Graphique(QWidget *parent = 0);
            void dessinerCourbesParfaiteDefaut(int);
            void dessinerCourbesErreurs();
     
    };
     
    #endif // GRAPHIQUE_H

    Graphique.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    for(int i=0;i<mw->getNbPoints();i++)
        {
            xParfait.push_back(mw->getTableauXParfait(i));
            yParfait.push_back(mw->getTableauYParfait(i));
    
            xDefaut.push_back(mw->getTableauXDefaut(i));
            yDefaut.push_back(mw->getTableauYDefaut(i));
        }
    ...
    Ce qui est en gras est apparemment faux mais je ne vois pas où est le soucis.
    J'ai déclaré un pointeur sur ma fenêtre principale dans Graphique.h pour récupérer les tableaux grâce à mes getters...

  2. #2
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Sans le message d'erreur du compilateur on ne peut pas vraiment t'aider...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Le programme compile mais le débogueur me dit qu'il y a un problème au niveau des getters.

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 665
    Points : 188 672
    Points
    188 672
    Par défaut
    Citation Envoyé par fab87 Voir le message
    Le programme compile mais le débogueur me dit qu'il y a un problème au niveau des getters.
    Citation Envoyé par YoniBlond Voir le message
    Sans le message d'erreur on ne peut pas vraiment t'aider...
    Là, tu nous demandes de chercher une aiguille dans une botte de foin... voire toute la ferme. Quels sont les messages d'erreur ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Il y a des segmentation fault au niveau des getters. Je ne peux malheureusement pas vous en dire plus, j'ai bien peur justement que c'est une aiguille dans une botte de foin!

  6. #6
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double getTableauXParfait(int i)  { return *(tableauXParfait+i); }
    Je crains que tu ne doives revoir tes bases en C/C++, tu retournes là ce qui est pointé par l'adresse de valeur tableauXParfait à laquelle on ajoute i.

    http://c.developpez.com/faq/?page=pointeurs

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Ah, mais tableauXParfait[i] est bien équivalent à *(tableauXParfait+i) nan?

    Pourtant, j'étais assez sûr de moi là... çà ne me choque pas

  8. #8
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Pour info ils sont définit ou tes tableaux (tableauXParfait,tableauXParfait...) car je ne les vois pas en variable membre de ta classe MainWindow ?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Normal, je n'ai pas mis tout mon code

    En membres privés de MainWindow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double *tableauXParfait; 
            double *tableauYParfait; 
           ...

  10. #10
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Citation Envoyé par fab87 Voir le message
    Ah, mais tableauXParfait[i] est bien équivalent à *(tableauXParfait+i) nan?
    En effet c'est équivalent (mais c'est moche ^^), et comme ta variable est un pointeur ça devrait fonctionner, si tu alloues bien ton tableau avant d'essayer d'y accéder, et si i est bien strictement inférieur à la taille de ton tableau.

    Dans tous les cas on évite ce genre de choses en C++ car ça mène à des seg fault assez facilement quand on est pas assez prudent, et que des classes ont été écrites pour nous faciliter la vie et éviter ce genre de plantage :
    http://qt.developpez.com/doc/4.7/qvector/

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    J'ai bien alloué tous les tableaux dans le constructeur de MainWindow...
    Je croyais que j'avais fait une erreur tu m'as dit tout à l'heure

  12. #12
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Points : 1 672
    Points
    1 672
    Par défaut
    Tu fais de l'allocation à un moment sur tes tableaux ou pas ? (un new, un malloc...) . Sinon comme le dit YoniBlond tu vas surement dans un zonne mémoire non alloué pour ton tableau (index trop grand).

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Points : 9
    Points
    9
    Par défaut
    Oui je fais des new sur mes tableaux avant de passer dans la méthode dessinerCourbesParfaiteDefaut() dans le slot calculer()
    Voici le code :

    tableauXParfait = new double[nbPoints]; tableauYParfait = new double[nbPoints];
    ...

    graphique->dessinerCourbesParfaiteDefaut();
    graphique->show();

Discussions similaires

  1. Problème de fuite de mémoire avec GTK+
    Par gwenhael dans le forum GTK+
    Réponses: 15
    Dernier message: 03/01/2008, 16h22
  2. Problème de libération de mémoire
    Par saturne13 dans le forum Linux
    Réponses: 9
    Dernier message: 06/02/2007, 09h18
  3. Plantage mémoire à l'éxécution
    Par delphidebutant dans le forum Langage
    Réponses: 7
    Dernier message: 18/04/2006, 16h57
  4. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  5. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38

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