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 :

"class" vector à indice variable et fonction membr


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut "class" vector à indice variable et fonction membr
    Bonjour tout le monde,

    J'aimerais savoir comment faire pour construire une classe vector avec indice négatives et/ou positive et qui pourra être redimmensionner.

    Aussi si vous sachez ou je pourrais trouver un code pour cette tâche, alors d'avance mille merci car c'est assez urgent (pour un projet à rendre demain).

    Cordialement.

    Ice

  2. #2
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    salut,

    tu peux définir une classe qui contient un membre std::vector.
    au constructeur, tu passes l'indice min (positif ou négatif) et la taille

    tu surcharges l'opérateur [] pour que l'indice 0 du vector correspondent à l'indice min

    l'indice dans le vector est abs(i - indice min)

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Salut,

    Désolé mais ca fais 6 mois que je n'ai pas fait du cpp, aussi j'ai oublié comment faire pour utiliser la std::vector. Ce serait bien si tu pouvais m'aider à compléter la classe ci dessous.

    D'avance merci.

    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
    class Vect()
    {
    private :
    int size;
     
    public :
    std::vector<double> Vect (int n);  //J'ai oublié la façon de faire
     
    Vect (int i =1, int j =3);
    Vect (const Vect&);
    ~Vector ();
    const Vect& operator = (const Vect&);   //assignment operator
    double& operator [](int) const; //operateur pour l'indexation
     
    }

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Cette fois ci je crois que j 'y suis presqque :

    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
    class Vect() 
    { 
    private : 
    int size; 
    std::vector <double> * data;
     
    public : 
    std::vector<double> Vect (int n);  //J'ai oublié la façon de faire 
     
    Vect (int min =-3, int max = 5); 
    Vect (const Vect&); 
    ~Vector (); 
    const Vect& operator = (const Vect&);   //assignment operator 
    double& operator [](int) const; //operateur pour l'indexation 
     
    };
     
    double& Vect::operator[](int i) const
    {
    if (i>=0)
    return data[i];
    else return data[ abs(min)-i];
     
    }

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    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
    class Vect 
    { 
    private : 
       std::vector<double> data;
       int indexMin;
     
    public : 
       Vect (int indiceMin = 0,int taille = 0);
       Vect (const Vect&); 
       ~Vector (); 
     
       const Vect& operator = (const Vect&);   //assignment operator 
       double operator[](int) const; //operateur pour l'indexation 
       double & operator[](int); // operateur [] pour l'affectation
    };
     
    double Vect::operator[](int i) const
    {
       int taille = data.size();
       if (i>=indexMin && i<taille+indexMin)
          return data[i-indexMin];
       else
          // exception
    }
    fait rapidement et non vérifié.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Sans vouloir abuser, est ce qu'il ne serait pas possible que tu me donne le bout de en entier car la il me reste qu'une heure pour finir (je dois envoyer la prog ce soir au plus tard à 19h00).

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Il y a bug (certainement tout bête à débugger) qui me bloque lors de la construction de mon vecteur intermédiare :

    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
    #include <iostream>
     
    using namespace std;
     
    template <class T> class Vect
    {
      public :
    	Vect (unsigned n=8) : size(n), data (new T[size]){ }
    	Vect (const Vect<T>& v) : size(v.size), data (new T[size])
    	{ copy(v);}
    	~Vect<T>(){delete [] data;}
    	Vect<T>& operator=(const Vect<T>&);
    	T& operator[](unsigned i) const {return data[i];}
    	unsigned size() {return size;}
     
      protected:
      T* data;
      unsigned size;
      void copy (const Vect<T>&);
     };
     
     
    template<class T> Vect<T>& Vect<T>::operator=(const Vect<T>& v)
    { size = v.size();
      data = new T[size];
      copy(v);
      return * this;
    }
     
    template<class T> void Vect<T>::copy (const Vect<T>& v)
    {unsigned min_size = (size < v.size ? size : v.size);
      for (int i = 0; i < min_size; i++)
    	data[i] = v.data[i];
    }

    Programme principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include "Vect.cpp"
     
    using namespace std;
     
    int main()
    {
      Vect<short> v;
      v[5] = 127;
      Vect<short> w = v, w(3);
      cout << w.size();
     
    }
    Lorsque je compile j'ai un message d'erreur suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    c:\documents and settings\administrateur\bureau\Ice\vect.cpp(18) : error C2373: 'size' : redefinition; different type modifiers
            c:\documents and settings\administrateur\bureau\Ice\vect.cpp(14) : see declaration of 'size'
            c:\documents and settings\administrateur\bureau\Ice\vect.cpp(20) : see reference to class template instantiation 'Vect<T>' being compiled
    c:\documents and settings\administrateur\bureau\Ice\vect.cpp(18) : error C2373: 'size' : redefinition; different type modifiers
            c:\documents and settings\administrateur\bureau\Ice\vect.cpp(14) : see declaration of 'size'
            c:\documents and settings\administrateur\bureau\Ice\mainprog.cpp(8) : see reference to class template instantiation 'Vect<short>' being compiled
    c:\documents and settings\administrateur\bureau\Ice\mainprog.cpp(10) : error C2086: 'w' : redefinition
    c:\documents and settings\administrateur\bureau\Ice\mainprog.cpp(11) : error C2264: 'size' : error in function definition or declaration; function not called
    c:\documents and settings\administrateur\bureau\Ice\mainprog.cpp(13) : warning C4508: 'main' : function should return a value; 'void' return type assumed
    Error executing cl.exe.
     
    MainProg.exe - 4 error(s), 1 warning(s)
    Merci pou ce n-ième coup de pouce.

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    1. ne pas appeler une variable membre et une fonction membre de la même façon

    2. tu as déclaré 2 w dans ton main, normal que le compilateur râle

    lis bien les erreurs qu'indique le compilateur, elles sont bien explicites. et en plus il te donne le numéro de la ligne qui pose problème...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    En effet, je m'en suis rendu compte un peu après.

    Mais après correction telle quelle :

    #include <iostream>

    using namespace std;

    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
    template <class T> class Vect
    {
      public :
    	Vect (unsigned n=8) : size_(n), data (new T[size_]){ }
    	Vect (const Vect<T>& v) : size_(v.size_), data (new T[size_])
    	{ copy(v);}
    	~Vect<T>(){delete [] data;}
    	Vect<T>& operator=(const Vect<T>&);
    	T& operator[](unsigned i) const {return data[i];}
    	unsigned size() {return size_;}
     
      protected:
      T* data;
      unsigned size_;
      void copy (const Vect<T>&);
     };
     
     
    template<class T> Vect<T>& Vect<T>::operator=(const Vect<T>& v)
    { size_ = v.size();
      data = new T[size];
      copy(v);
      return * this;
    }
     
    template<class T> void Vect<T>::copy (const Vect<T>& v)
    {unsigned min_size = (size_ < v.size_ ? size_ : v.size_);
      for (int i = 0; i < min_size; i++)
    	data[i] = v.data[i];
    }

    Programme principal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include "Vect.cpp"
     
    using namespace std;
     
    int main()
    {
      Vect<short> v;
      v[5] = 127;
      Vect<short> w = v, x(3);
      cout << w.size();
     
      return 0;
    }
    J'obtiens une exception :

    "L'instruction à "Ox004015c8" emploie l'adresse mémoire "Ox0000000a".
    La mémoire ne peut pas être "written"".

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    J'ai trouvé le bug :

    Il fallait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vect (unsigned n=8) : size_(n), data (new T[n]){ } 
       Vect (const Vect<T>& v) : size_(v.size_), data (new T[v.size_])
    à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vect (unsigned n=8) : size_(n), data (new T[size_]){ } 
    Vect (const Vect<T>& v) : size_(v.size_), data (new T[size_])
    .

  11. #11
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Ensuite pour arriver au résultat, j'ai crée la classe Array:


    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
    #include <iostream>
    #include  "Vect.cpp"
     
    using namespace std;
     
    template <class T> class Array : public Vect<T>
    {
      public :
    	  Array (int i, int j) : i0(i), Vect<T>(j-i+1){ }
    	  Array (const Array<T>& v):i0(v.i0), Vect<T>(v) { }
    	  T& operator [](int i) const { return Vect<T>::operator[](i-i0);}
    	  int firstSubscript () const { return i0;}
    	  int lastSubscript () const {return i0+size_-1;}
     
     
      protected :
    	  int i0;
     };
    Et voici le programme principal qui marche assez bien :
    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 <iostream>
    #include "Array.h"
     
    using namespace std;
     
    int main()
    {
      Array<float> x(-1,1);
      x[-1]=3.14159;
      x[0]=0.08516;
      x[1]=5041.92;
     
      cout << "x.size () = " << x.size()  << endl;
      cout << "x.firstSubscript() = " << x.firstSubscript()  << endl;
      cout << "x.lastSubscript() = " << x.lastSubscript()  << endl;
     
      for (int i=-1; i<=1; i++)
      cout << "x[" << i << "] = " << x[i] << endl;
     
     
      return 0;
     
    }
    Seulement je ne vois pas comment modifier mes classes Vect et Array afin de pouvoir obtenir une fonction membre Redimensionne (), tel que je puisse faire par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Array<short> u;
    u.Redimensionne (-3,3);

  12. #12
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Salut,

    Juste au passage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <class T> class Vect
    {
      protected:
      T* data;
      unsigned size_;
     };
    En fait dans une liste d'initialisation (après les ":" dans le constructeur), les membres sont initialisés dans l'odre où ils sont déclarés (et non pas l'ordre où tu les mets dans l'initialisation).

    Ce qui explique ton problème de :
    Vect (unsigned n=8 ) : size_(n), data (new T[size_]){ }
    (puisque l'allocation new T[size_] va se faire en 1er, alors que size_ est encore indéterminé).

  13. #13
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Ouaouh!!!! On en apprend touss les jours 8) .

    Merci bigquick.

    A bientôt

    Icetechnik

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 589
    Points
    41 589
    Par défaut
    heureusement, un compilateur bien configuré te préviendra de cette [subt/déb]ilité.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Janvier 2004
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 49
    Points : 25
    Points
    25
    Par défaut
    Je suppose qu'un compilateur comme GNU gcc devrait faire l'affaire....

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