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 :

Vector not accessible


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Vector not accessible
    Bonjour,
    Je compile avec l'ide de Qt en C++
    J'ai crée une classe polynome dont voici le fichier d'en-tète:

    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
     
    #ifndef POLYNOME_H
    #define POLYNOME_H
     
    #include <vector>
    #include <string>
     
     
    class Polynome
    {
    public:
     
        /******** Contructeur *******/
     
        Polynome();
        Polynome (const std::string &poly);
     
        Polynome operator+(Polynome const &a);
     
        void setCoeff(int coeff);
        void display(void);
     
    private:
     
        std::vector<int> m_exposant;
        std::vector<int> m_coeff;
    };
     
     
    #endif // POLYNOME_H
    Dans le source, il y a la méthode suivante qui ne fonctionne pas:

    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
    Polynome Polynome::operator+(Polynome const &a)
    {
        Polynome retour;
        uint8_t i = 0;
     
        while (i < m_coeff.size())
        {
            retour.m_coeff.push_back(m_coeff.at(i) + a.m_coeff.at(i));
            i++;
            if (i >= m_coeff.size())
                break;
        }
     
        return retour;
    }
    Lorsque je debug l'application avec un point d'arrêt après la création de l'objet retour, les membres m_coeff et m_exposant qui sont des vectors ont comme valeur <not accessible> ou <unavailable synchroneous data>.
    la methode push_back n'a aucun effet comme si l'objet n'avait pas été crée.
    Je vous remercie d'avance pour votre aide et vos suggestions.
    Cordialement,

  2. #2
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Points : 103
    Points
    103
    Par défaut
    Une chose, peut-être hors propos pour ton problème, ton constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Polynome (const std::string &poly);
    ne devrait pas plutôt prendre un paramètre de type Polynome ?

    Par ailleurs, est-ce que ton programme compile ?
    Il me semble que tes attributs m_coeff et m_exposant sont privés, donc non accessible directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour.m_coeff.push_back(...)
    ne doit pas fonctionner ?

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    http://cpp.developpez.com/faq/cpp/?p...private_public

    @MicBeastKiller
    Avec const Polynome& au lieu de const string&, cela devient un constructeur par copie et non un constructeur de conversion. Ce n'est peut être pas ce qu'il veut (d'autant plus que le constructeur par copie par défaut fonctionnera parfaitement, pas besoin de le redéfinir)
    @director
    Prend l'habitude de mettre par défaut le mot clé explicit devant tes constructeurs de conversion, sauf quand tu choisis explicitement () de ne pas le mettre

  4. #4
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    http://cpp.developpez.com/faq/cpp/?p...private_public

    @MicBeastKiller
    Avec const Polynome& au lieu de const string&, cela devient un constructeur par copie et non un constructeur de conversion. Ce n'est peut être pas ce qu'il veut (d'autant plus que le constructeur par copie par défaut fonctionnera parfaitement, pas besoin de le redéfinir)
    @director
    Prend l'habitude de mettre par défaut le mot clé explicit devant tes constructeurs de conversion, sauf quand tu choisis explicitement () de ne pas le mettre
    C'est bien pour cela que je posais une question et pas une affirmation car sans visibilité sur le code de la fonction. Mais sûrement autant pour moi

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour, que veux-tu dire par "la fonction ne marche pas" ?
    Elle crash, ne fait pas ce que tu souhaites, le fais mal ?
    Puisque tu parles de debug, ça compile, et donc ça devrait fonctionner (ta fonction n'est pas bien compliquée).

    @gbdivers:
    Où serait le problème de visibilité ? m_coef est private mais operator+ est membre de Polynome et peut donc accéder aux membres private des Polynome.

    C'est surtout ta boucle qui me fait ticker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        while (i < m_coeff.size())
        {
            retour.m_coeff.push_back(m_coeff.at(i) + a.m_coeff.at(i));
            i++;
            if (i >= m_coeff.size())
                break;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tant que i < size
      action
      incrémenter i
      si i >= size
        break
      finsi
    fintantque
    Ton if est juste redondant, et donc inutile, avec la condition du while.
    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.

  6. #6
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 140
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Bonjour, que veux-tu dire par "la fonction ne marche pas" ?
    Elle crash, ne fait pas ce que tu souhaites, le fais mal ?
    Puisque tu parles de debug, ça compile, et donc ça devrait fonctionner (ta fonction n'est pas bien compliquée).

    @gbdivers:
    Où serait le problème de visibilité ? m_coef est private mais operator+ est membre de Polynome et peut donc accéder aux membres private des Polynome.

    C'est surtout ta boucle qui me fait ticker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        while (i < m_coeff.size())
        {
            retour.m_coeff.push_back(m_coeff.at(i) + a.m_coeff.at(i));
            i++;
            if (i >= m_coeff.size())
                break;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tant que i < size
      action
      incrémenter i
      si i >= size
        break
      finsi
    fintantque
    Ton if est juste redondant, et donc inutile, avec la condition du while.
    Justement, a-t-il le droit d'utiliser directement le push_back de l'attribut m_coeff du Polynome retour de sa fonction ?

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Citation Envoyé par Bousk Voir le message
    @gbdivers:
    Où serait le problème de visibilité ? m_coef est private mais operator+ est membre de Polynome et peut donc accéder aux membres private des Polynome.
    Effectivement. J'ai donné la FAQ suite à la réponse de MicBeastKiller, mais il n'y a pas de problème ici

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    J'ai lu vos réponses et vous en remercie.
    Ce qui est curieux c'est que le programme fonctionne !
    Voici le main:
    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
     
    #include"polynome.h"
    #include<iostream>
    #include <QtCore/QCoreApplication>
    using namespace std;
     
    int main(int argc, char *argv[])
    {
     
        QCoreApplication a(argc, argv);
     
        Polynome result;
        Polynome pol("355^4+343^3+3^2");
        Polynome pol1("3^4+33^3+3^2");
     
        result = pol + pol1;
     
        pol.display();
        pol1.display();
        result.display();
        return a.exec();
     
    }
    La surcharge de l'opérateur + fonctionne et l' attributs (m_coeff) de l'objet result est bien le résultat de l'addition des attributs de pol et pol1 (358, 376, 6).
    Pourtant en debug pas à pas, impossible d'afficher en local les attributs de l'objet retour .

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu break bien après la déclaration/création de la variable ?
    Quel debuger ?
    Tu compiles bien sans aucune optimisation en debug ?

    Donc ça fonctionne.
    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.

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Mon point d'arrêt est situé avant la création de l'objet.
    Le debugger est celui livré avec l'IDE de QT, à savoir GDB me semble t-il.
    "Tu compiles bien sans aucune optimisation en debug ?"
    Pour l'instant je ne peux pas répondre car je ne trouve pas où se paramètre l'optimisation du compilateur dans l'IDE.
    Effectivement, je me suis demandé si le compilateur ne simplifiait pas le code et finalement l'objet retour n'avait pas d'existence réelle en mémoire. En C embarqué, on utilise souvent le mot volatile avant les variables pour éviter des optimisations trop importante qui peuvent donner lieu à des dysfonctionnements. J'ai essayé dans ce cas pour l'objet retour mais cela me génère des erreurs de compilation

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Si tu break avant la création de l'objet, tu n'as aucune chance de pouvoir en admirer le contenu.
    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.

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je l'ai mis avant ou/et après aussi.
    Lorsque mon point d'arrêt est situé avant l'objet, ensuite je fait du pas à pas.

Discussions similaires

  1. pb envoi mail "Could not access 'CDO.Message' object"
    Par adaneels dans le forum ASP.NET
    Réponses: 3
    Dernier message: 07/05/2009, 15h29
  2. vector reserve & accession
    Par Julgood dans le forum SL & STL
    Réponses: 3
    Dernier message: 19/03/2009, 01h19
  3. Could not access 'CDO.Message' object
    Par User.Anonymous dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 11/12/2008, 01h32
  4. Réponses: 0
    Dernier message: 18/12/2007, 12h49
  5. Réponses: 4
    Dernier message: 17/04/2007, 17h00

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