Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme dans la compilation

Sujet résolu
    1 août 2007 à 12:46:59

    bjr, voila j'essaye de compiler un fichier avec g++ et ça me genere des erreurs que je comprenne pas d'ou ça viens, pourtant quand j'utilisait visual c++ 6.0 tout se passé bien.

    donc si vous pouvez m'aider ça serai sympa.

    voici le code de mes classes :
    Fichier : ErreurVecteur.h

    #ifndef ERREURVECTEUR
    #define ERREURVECTEUR

    #include <iostream>
    using namespace std;


    class ErreurVecteur{

            char *message;

    public:
            ErreurVecteur(int i=0);
            ~ErreurVecteur();

            char * leMessage();
            friend  ostream & operator<<(ostream &, ErreurVecteur );
    };

    #endif

     


    Fichier ErreurVecteur.cpp

    #include "ErreurVecteur.h"


    ErreurVecteur::ErreurVecteur(int i)
    {
            switch(i)
            {
            case 0 :
                    message = "DSL Vous avez depassez les bornes du vecteur !!!";
                    break;
            case 1:
                    message = "DSL Vos vecteurs n'ont pas la meme dimension !!!";
                    break;
            case 2:
                    message = "DSL Vous ne pouvez pas divizer le vecteur par zero !!!";
                    break;
            }
    }

    ErreurVecteur::~ErreurVecteur()
    {

    }

    char * ErreurVecteur::leMessage()
    {
            return message;
    }


    ostream & operator<<(ostream &out, ErreurVecteur erreur)
    {
            out << erreur.message<<endl;

            return out;
    }
     


    /*
    vecteur.h
    ~~~~~~~~~

      Par  : ..., pour le PFE.
      Rôle : Définit la class vecteur.

      Date de Création              : Vendredi 16 Mars 2007
      Date de dérnière Mise à  jour : Vendredi 29 Mai 2007

    */



    #ifndef VECTEUR
    #define VECTEUR

    #include <iostream>
    using namespace std;
    #include <cmath>
    #include "ErreurVecteur.h"


    class vecteur{
           
    protected:     
            int dim;
            double *vect;

    public:

            vecteur(int n=0);
            vecteur(vecteur &);
            ~vecteur();
            vecteur & operator=(vecteur &); // Operator d'affectaion

            void saisie();      // Permet la saisie d'un vecteur
            void afficher();                        // Permet l'afichage d'un vecteur

            int  getDim() const;            // Retourne la dimension du vecteur
            void setDim(int ) ;             // Modifie la dimension du vecteur

            int  position(double );   // Retourne la position d'un élément
            int  positionDuSuivant(double)// retourne la position de l'élement suivant

            void trier();               // Trie le vecteur

            double & operator [] (int) const;              // Permet l'accès aux éléments d'un vecteur
           
            double norme2();

            friend vecteur operator+(vecteur , vecteur ) ;
        friend vecteur operator-(vecteur , vecteur ) ;
        friend double  operator*(vecteur , vecteur ) ;

            friend vecteur operator*(double  , vecteur  ) ;
            friend vecteur operator*(vecteur , double  ) ;

            friend vecteur operator/(vecteur , double  ) ;

            friend ostream & operator<<(ostream&, vecteur );
            friend istream & operator>>(istream&, vecteur &);

            vecteur & operator+=(vecteur );
        vecteur & operator-=(vecteur );
        vecteur & operator*=(double  );


    };

    #endif

     


    /*
    vecteur.cpp
    ~~~~~~~~~

      Par  : ..., pour le PFE.
      Rôle : Définit les méthodes de la class vecteur.

      Date de Création              : Vendredi 16 Mars 2007
      Date de dérnière Mise à  jour : Vendredi 29 Mai 2007

    */



    #include <cassert>
    #include "vecteur.h"


    // Constructeur
    vecteur::vecteur(int n){
            dim = n;
            vect = new double[dim];
    }

    // Constructeur de recopie
    vecteur::vecteur(vecteur &v){
            dim = v.dim;
            vect = new double[dim];
            for(int i=0; i<dim; i++)
                    vect[i] = v.vect[i];
    }

    // Destructeur
    vecteur::~vecteur(){
        delete []vect;
    }

    // Operator d'affectaion
    vecteur & vecteur::operator=(vecteur &v){
            if(this != &v)
            {
                    this->vecteur::~vecteur();
                    this->vecteur::vecteur(v);
            }
            return (*this);
    }


    // Permet la saisie d'un vecteur
    void vecteur::saisie(){
            for(int i=0; i<dim; i++)
                    {
            cout<<"   donner l'element :"<<i+1<<" = ";
            cin>>vect[i];
                    }
    }

    // Permet l'affichage d'un vecteur
    void vecteur::afficher()
    {
            cout << "[";
       for(int i=0;i<dim;i++)
       {
             cout<<vect[i]<<", ";
            }
            cout << "]"<<endl;
    }

    // Permet l'accès au éléments d'un vecteur
    double & vecteur::operator [] (int i) const{
        if(i>=dim || i<0)
                    throw ErreurVecteur(0) ;

        return vect[i];
    }

    double vecteur::norme2()
    {
            double norme = 0.0;
            for(int i=0; i<dim; i++)
                    norme += vect[i]*vect[i];

            return sqrt(norme);
    }

    // Retourne la dimension du vecteur
    int  vecteur::getDim() const{
            return dim;
    }

    //modifie la dimension du vecteur
    void vecteur::setDim(int n)
    {
            dim = n;
    }


    //Retourne la position de l'élément x
    int vecteur::position(double x)
    {
            for(int i=0; i<dim; i++)
                    if(vect[i] == x)
                            return i;

            return -1;
    }

    //Retourne la position de l'élément directement superieur à x
    int vecteur::positionDuSuivant(double x)
    {
            this->trier();
            if( x >= vect[0] && x <= vect[dim-1] )  //Si x est inclus dans le tableau
            {
                    int i = 0;
                    while(x < vect[i])
                            i++;

                    return i;
            }
            else
                    return -1;
    }


    // Trie le vecteur
    void vecteur::trier()
    {
            double temp;

       for(int i=0; i < dim-1; i++)
            for(int j=i+1; j < dim; j++)
           if (vect[i] > vect[j])
                {
                              temp = vect[i];
                  vect[i] = vect[j];
                  vect[j] = temp;
                            }
    }


    // Ici sont définies les operations élémentaires sur les vecteurs
    vecteur operator+(vecteur U, vecteur V)
    {
      if(U.getDim() != V.getDim() )
              throw ErreurVecteur(1);

      int n = U.getDim();
      vecteur tmp(n);

       for (int i=0; i<n; i++)
             tmp[i] = U[i] + V[i];

       return tmp;
    }

    vecteur operator-(vecteur U, vecteur V)
    {
            if(U.getDim() != V.getDim() )
              throw ErreurVecteur(1);

       int n = U.getDim();
       vecteur tmp(n);
       for (int i=0; i<n; i++)
          tmp[i] = U[i] - V[i];

       return tmp;
    }


    double operator*(vecteur U, vecteur V)
    {
       if(U.getDim() != V.getDim() )
              throw ErreurVecteur(1);

       int n = U.getDim();
       double tmp = 0.0;

          for(int i=0; i<n; i++)
                   tmp += U[i] * V[i];

       return tmp;
    }

    vecteur operator*(double nb , vecteur U )
    {
       int n = U.getDim();
       vecteur tmp(n);

       for (int i=0; i<n; i++)
             tmp[i] = U[i] * nb;

       return tmp;
    }

    vecteur operator*(vecteur U, double nb )
    {
       int n = U.getDim();
       vecteur tmp(n);

       for (int i=0; i<n; i++)
          tmp[i] = U[i] * nb;

       return tmp;
    }

    vecteur & vecteur::operator+=(vecteur U)
    {
            (*this) = (*this)+U;

            return (*this);
    }

    vecteur & vecteur::operator-=(vecteur U)
    {
            (*this) = (*this)-U;

            return (*this);
    }



    vecteur & vecteur::operator*=(double nb)
    {
            (*this) = (*this) * nb;

            return (*this);
    }

    vecteur operator/(vecteur U, double nb)
    {
            if(nb == 0)
                    throw ErreurVecteur(2);

       int n = U.getDim();
       vecteur tmp = U;

          for(int i=0; i<n; i++)
                tmp[i] /= nb;

       return tmp;
    }
    // Fin des operations élémentaires sur les matrices

    ostream & operator<<(ostream& out, vecteur U)
    {

       out << "[";
       for(int i=0;i<U.dim;i++)
       {
             out<<U[i]<<", ";
       }
       out << "]"<<endl;

            return out;

    }

    istream & operator>>(istream& in, vecteur &U)
    {
        for(int i=0; i<U.dim; i++)
                    {
            cout<<"   donner l'element :["<< i+1 <<"] = ";
            in>>U[i];
                    }

            return in;
    }


     


    voici l'erreur que ça me genere apres compilation avec la commande : g++ -o vecteur vecteur.cpp .

    Setting up a MinGW/Qt only environment...
    -- QTDIR set to C:\Qt\4.2.3
    -- PATH set to C:\Qt\4.2.3\bin
    -- Adding C:\MinGW\bin to PATH
    -- Adding C:\WINDOWS\System32 to PATH
    -- QMAKESPEC set to win32-g++

    C:\Qt\4.2.3>cd ../..

    C:\>cd mingw/exe

    C:\MinGW\exe>g++ vecteur.cpp
    vecteur.cpp: In member function `vecteur& vecteur::operator=(vecteur&)':
    vecteur.cpp:42: error: invalid use of `class vecteur'
    vecteur.cpp: In member function `vecteur& vecteur::operator+=(vecteur)':
    vecteur.cpp:207: error: no match for 'operator=' in '*(vecteur*)this = operator+
    (vecteur, vecteur)(vecteur(((vecteur&)(&U))))'
    vecteur.cpp:38: note: candidates are: vecteur& vecteur::operator=(vecteur&)
    vecteur.cpp: In member function `vecteur& vecteur::operator-=(vecteur)':
    vecteur.cpp:214: error: no match for 'operator=' in '*(vecteur*)this = operator-
    (vecteur, vecteur)(vecteur(((vecteur&)(&U))))'
    vecteur.cpp:38: note: candidates are: vecteur& vecteur::operator=(vecteur&)
    vecteur.cpp: In member function `vecteur& vecteur::operator*=(double)':
    vecteur.cpp:223: error: no match for 'operator=' in '*(vecteur*)this = operator*
    (vecteur, double)(nb)'
    vecteur.cpp:38: note: candidates are: vecteur& vecteur::operator=(vecteur&)

    C:\MinGW\exe>


    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      1 août 2007 à 13:24:23


      // Operator d'affectaion
      vecteur & vecteur::operator=(vecteur &v){
              if(this != &v)
              {
                      this->vecteur::~vecteur();
                      this->vecteur::vecteur(v);
              }
              return (*this);
      }


      Ce quoi ce code !?!?!
      On n'appele jamais explicitement le destructeur d'une classe(sauf dans un cas extrement rare)

      Le but de l'operateur d'affectation est
      1: detruire les partie dynamique de l'objet.
      2:reserve de la place pour pouvoir copié les nouvelle
      3: copier les nouvelle donnée(dynamique ou pas).

      La tu fais un truc imonde.

      Edit : De plus, tu nous balance tout le code comme ca avec jsute les erreurs dans le sens "trouvez moi l'erreur"
      Pour la peine , je ne t'aiderai pas plus.
      • Partager sur Facebook
      • Partager sur Twitter
        1 août 2007 à 22:13:00

        Je suis vrmt dsl pour le code.

        pour ta reponse "Davidbrcz" :
        Le but de l'operateur d'affectation est
        1: detruire les partie dynamique de l'objet.
        2:reserve de la place pour pouvoir copié les nouvelle
        3: copier les nouvelle donnée(dynamique ou pas).

        je crois que c'est le but du constructeur de recopie.

        et le probleme c'est que qu'on je compile avec VC++ 6.0 ou VC++ express tout se passe bien.

        merci d votre aide.
        • Partager sur Facebook
        • Partager sur Twitter
          1 août 2007 à 22:14:03

          Des erreurs.
          Et des const oubliés.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            1 août 2007 à 22:26:32

            pardon; j'ai pas bien compris ta reponse.est ce que tu parles des parametres des fonction??
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              1 août 2007 à 22:42:21

              L'operateur d'affection et le constructeur de recopie ont globalement le même role , c'est juste qu'ils sont appelé a des moments différent.
              Pour preuve la rêgle veut que si on en redéfinit un des deux , on doit surdéfinir l'autre.

              Edit : malgré ce que j'ai dit , voila la déclarartion de classe corigé par moi :

              class vecteur{
                     
              protected:     
                      int dim;
                      double *vect;

              public:

                      vecteur(int n=0);
                      vecteur(const vecteur &);
                      ~vecteur();
                      vecteur& operator=(const vecteur &); // Operator d'affectaion

                      void saisie();      // Permet la saisie d'un vecteur
                      void afficher() const ;                        // Permet l'afichage d'un vecteur

                      int  getDim() const;            // Retourne la dimension du vecteur
                      void setDim(int ) ;             // Modifie la dimension du vecteur

                      int  position(double ) const;   // Retourne la position d'un élément
                      int  positionDuSuivant(double) ; // retourne la position de l'élement suivant

                      void trier();               // Trie le vecteur

                      double & operator [] (int) const;              // Permet l'accès aux éléments d'un vecteur
                     
                      double norme2() const;

                      friend vecteur operator+(vecteur , vecteur ) ;
                  friend vecteur operator-(vecteur , vecteur ) ;
                  friend double  operator*(vecteur , vecteur ) ;

                      friend vecteur operator*(double  , vecteur  ) ;
                      friend vecteur operator*(vecteur , double  ) ;

                      friend vecteur operator/(vecteur , double  ) ;

                      friend ostream & operator<<(ostream&, vecteur );
                      friend istream & operator>>(istream&, vecteur &);

                      vecteur & operator+=(vecteur );
                  vecteur & operator-=(vecteur );
                  vecteur & operator*=(double  );


              };

              //Apres

              // Constructeur de recopie
              vecteur::vecteur(const vecteur &v){
                      vect = new double[dim=v.dim];
                      for(int i=0; i<dim; i++)
                              vect[i] = v.vect[i];
              }

              // Operator d'affectaion
              vecteur & vecteur::operator=(const vecteur &v){
                      if(this != &v)
                      {
              //et le delete[] de vect tu en fait quoi ?
              //Car ici vect a déj été alloué , il faut le désaoullé puis le réalloué

                      delete[] vect;
                      vect= new double[dim=v.n];
              for(int i=0; i<dim; i++)
                              vect[i] = v.vect[i];
                      }
                      return (*this);
              }
               


              Edit2: je crois que c'est le but du constructeur de recopie. >> J'ai vérifié et non c'est bien l'operateur d'affectation car le cst de recopie n'a pas a détruire des données l'operateur d'affectation si.
              • Partager sur Facebook
              • Partager sur Twitter
                1 août 2007 à 22:50:24

                oui c'est ce que j'ai appris aussi.

                le truc que je fais avec mon operateur d'affectation c'est que je teste les adresses pour traiter le cas :

                vecteur v;
                v = v;
                 


                mnt ce que je ne comprend pas , c'est pourquoi ça me genere ces erreurs alors que mon code est juste.

                je suis mnt sur la QT4. et a cause de ce probleme je suis calé.

                merci a vous pour votre aide.


                Merci pour ta reponse j vais essayer cette solution. j'ai malheureusement pas d connexion chez moi, donc j'irai le tester chez moi et je vous repondrai apres
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  1 août 2007 à 23:09:26

                  Teste ton code avec mon operateur d'affectation et de cst de recopie.
                  De plus au niveau purement mamthématique , ton poduit vectoriel lme parait zarb.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 août 2007 à 23:27:26

                    Les friends ne servent à rien ; cf l'écriture canonique que j'avais donnée dans ma "critique" du tuto qui correspond.

                    L'opérateur d'affectation n'est pas bon. (je n'écris pas en gras, mais le coeur y est)
                    1- Le test d'auto-affectation est un contre idiome
                    2- Toujours. TOUJOURS allouer avant de désallouer dans un opération histoire de pouvoir la rendre atomique. Du coup avec un swap, c'est écrit en 30 seconde -- cf la FAQ C++ de developpez, ou une de mes critiques précédentes.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                      4 août 2007 à 18:00:25

                      Voila, Merci a vous mon probleme est reglé. Mais j'ai une autre question, pq quand je compile avc VC++ express tt se passe bien. est ce qe le g++ est si stricte??

                      j'espere ne plus tomber dans des problemes pareils.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 août 2007 à 23:16:42

                        svp est ce que qlq'un peut repondre a ma question precédente??
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          7 août 2007 à 11:14:29

                          parce que g++ respecte un peu plus la norme ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 août 2007 à 20:26:47

                            Ils ne respectent pas forcément les mêmes choses dans la norme.
                            Ainsi, les GCC sous windows sont anciens, et certaines choses (très anvancées) crachent le compilo ou donnent des résultats sans rapport avec la choucroute.

                            Dans les deux cas, compile en désactivant le support des extensions propriétaires, et exige le niveau de warnings maximal. Cela devrait réduire les surprises.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

                            Probleme dans la compilation

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown