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

Langage C++ Discussion :

Pointeur de tableau Template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut Pointeur de tableau Template
    Bonjour, j'explique mon soucis, j'ai un vecteur de template que je passe a une fonction. je le modifie dans cette fonction mais lorsque je l'affiche a la sortie de la fonction il n'a pas été modifié??

    voici le bout de code:

    l'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    addContrat(vectV,vectCl);
    	vectCl->affiche();

    le code:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    void addContrat(Vecteur<Vehicule> *pVehicule,Vecteur<Client> *pClient)
    {
    	cout<<" Nouveaux contrats"<<endl;
    	cout<<"-------------------"<<endl;
     
    	char choix;
    	cout<<"Est-ce un contrat d'assurance pour voiture [(o)ui - (n)on]? ";
    	cin>>choix;
    	system("clear");
    	fpurge(stdin);
     
    	FichierClient client("/Users/juliengarciagonzalez/client.dat");
    	if(choix=='o')
    	{
    		cout<<" Nouveaux contrats Assurance Vehicule"<<endl;
    		cout<<"--------------------------------------"<<endl;
     
    		FichierContratVehicule contratVeh("/Users/juliengarciagonzalez/contratVeh.dat");
    		ContratAssuranceVehicule CA;
    		cin>>CA;
    		pClient=addCL(pClient);
    		pVehicule=addVehicule(pVehicule);
     
    		Client Cl;
    		Cl=pClient->getElement(countCl-1);
    		CA.setIdClient(Cl.getIdentification());
    		client.save(Cl);
     
    		Vehicule veh;
    		veh=pVehicule->getElement(countV-1);
    		char buf[7];
    		strcpy(buf,veh.getImmatriculation());
    		CA.setCAVehicule(buf);
    		contratVeh.save(CA);
     
    		return;
    	}
    	cout<<" Nouveaux contrats Assurance"<<endl;
    	cout<<"-----------------------------"<<endl;	
    	FichierContrat contrat("/Users/juliengarciagonzalez/contrat.dat");
     
    	ContratAssurance CA;
    	cin>>CA;
    	pClient=addCL(pClient);
     
    	Client Cl;
    	Cl=pClient->getElement(countCl-1);
    	CA.setIdClient(Cl.getIdentification());
    	client.save(Cl);	
    	contrat.save(CA);	
    	return;
    }
     
    Vecteur<Vehicule> * addVehicule(Vecteur<Vehicule> *p)
    {
    	Vecteur<Vehicule> *pNew = new Vecteur<Vehicule>(countV+1);
     
    	cout<<" Ajout d'un vehicule"<<endl;
    	cout<<"-------------------"<<endl;
    	*pNew=*p;
    	Vehicule mpTemp;
    	cin>>mpTemp;
     
    	pNew->setElement(countV, mpTemp);
    	countV++;
    	delete p;
    	p=pNew;
    	return p;
    }
     
    Vecteur<Client> * addCL(Vecteur<Client> *p)
    {
    	Vecteur<Client> *pNew = new Vecteur<Client>(countCl+1);
     
    	cout<<" Ajout d'un client"<<endl;
    	cout<<"-------------------"<<endl;
    	*pNew=*p;
    	Client mpTemp;
    	cin>>mpTemp;
     
    	pNew->setElement(countCl, mpTemp);
    	countCl++;
    	delete p;
    	p=pNew;
    	return p;
    }
    Merci d'avance

    julien

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par garciajulien Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		pVehicule=addVehicule(pVehicule);
    Là tu modifie ton pointeur pour qu'il pointe sur autre chose. Pas surprenant que tu ne vois rien de modifié à l'endroit où il pointait initialement.

    Par contre, sans connaître ta classe Vecteur, difficile de mieux t'aider.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Pourquoi passer tes vecteurs par pointeurs et non par référence?
    Pour ton problème, l'erreur est là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		pClient=addCL(pClient);
    		pVehicule=addVehicule(pVehicule);
    Lorsque tu passe un pointeur, c'est pour modifier la valeur pointée et non son adresse.
    Pourquoi dans addVehicule et addCL réalloué un nouveau vecteur pour ajouter le dernier élément? Ta logique est un peu surprenant: tu rajoutes un élément au vecteur et ensuite tu l'utilises pour renseigner ces valeurs? En restant dans ton optique tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void addVehicule(Vecteur<Vehicule> &_vect_vehicule)
    {
       _vect_vehicule.push_back(Vehicule());
    }
    Mais, pourquoi ne pas faire (j'ai repris qu'un bout, à transposer partout):
    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
     
    /*
    		pClient=addCL(pClient);
    		pVehicule=addVehicule(pVehicule);
     
    		Client Cl;
    		Cl=pClient->getElement(countCl-1);
    		CA.setIdClient(Cl.getIdentification());
    		client.save(Cl);
    */
    		Client Cl;
    		CA.setIdClient(Cl.getIdentification());
    		client.save(Cl);
    		pClient->push_back(Cl);
    ....
    [EDIT]: effectivement, j'ai supposé que ta classe Vecteur suivait std::vector. D'ailleurs, pourquoi ne pas utiliser directement celle-ci?

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    car je dois créer moi meme une classe vecteur pour mon cours.

    (quest-ce que ce push.back?)


    voici ma classe vecteur

    header:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /*
     *  Vecteur.h
     *  ISL1Q
     *
     *  Created by Julien Garcia Gonzalez on 6/11/08.
     *  Copyright 2008 __MyCompanyName__. All rights reserved.
     *
     */
    #ifndef _VECTEUR
    #define _VECTEUR
    #include <iostream>
    #include "Personne.h"
    #include "ContratAssurance.h"
    using namespace std;
     
    template<class T> class Vecteur
    {
    	private:
    		T *data;
    		int nbrElem;
    		int *occupation;
     
    	public:
    		//Constructeur
    		Vecteur(int n=10);
    		Vecteur(const Vecteur<T>& vect);
     
    		//Destructeur
    		~Vecteur();
     
    		//Fontions
    		void affiche();
    		int indiceValide(int empl);
    		int estOccupe(int empl);
    		T& retireElement(int empl);
    		Vecteur& operator=(const Vecteur& vect);
     
    		//Setter
    		void setElement(int empl,T dNew);
     
    		//Getter
    		T& getElement(int empl);
    		int getNbrElement(){return nbrElem;}
    };
    #endif
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    /*
     *  Vecteur.cpp
     *  ISL1Q
     *
     *  Created by Julien Garcia Gonzalez on 6/11/08.
     *  Copyright 2008 __MyCompanyName__. All rights reserved.
     *
     */
     
    #include <iostream>
    #include "Vecteur.h"
    using namespace std;
     
    template<class T>
    Vecteur<T>::Vecteur(int n)
    {
     
    	data=new T[n];
    	occupation=new int[n];
     
    	nbrElem=n;
    	for(int i=0;i<nbrElem;i++)
    	*(occupation+i)=0;
    }
     
    template<class T>
    Vecteur<T>::Vecteur(const Vecteur<T>& vect)
    {
    	int i;
    	for(i=0;i<nbrElem;i++)
    		{
    			*(data+i)=*(vect.data+i);
    			*(occupation+i)=*(vect.occupation+i);
    		}
    }
    template<class T>
    Vecteur<T>& Vecteur<T>::operator=(const Vecteur& vect)
    {
    	int i,nbrTemp;
     
    	if(nbrElem>=vect.nbrElem)
    		nbrTemp=vect.nbrElem;
    	else
    		nbrTemp=nbrElem;
     
    	for(i=0;i<nbrTemp;i++)
    		{
    			*(data+i)=*(vect.data+i);
    			*(occupation+i)=*(vect.occupation+i);
    		}
    	return *this;
    }
     
    template<class T>
    Vecteur<T>::~Vecteur()
    {
    	delete []data;
    	delete []occupation;
    }
     
    template<class T>
    void Vecteur<T>::affiche()
    {
    	for(int i=0;i<nbrElem;i++)
    	{
    		if(*(occupation+i)==1)
    			cout<<*(data+i)<<" ";
    		else
    			cout<<"-- ";
    	}
    }
     
    template<class T>
    int Vecteur<T>::indiceValide(int empl)
    {
    	if(empl<=nbrElem)
    		return 1;
     
    	return 0;
    }	
     
    template<class T>
    int Vecteur<T>::estOccupe(int empl)
    {
    	return *(occupation+empl);
    }
     
    template<class T>
    void Vecteur<T>::setElement(int empl,T dNew)
    {
     
    	*(occupation+empl)=1;
    	*(data+empl)=dNew;
    }
     
    template<class T>
    T& Vecteur<T>::getElement(int empl)
    {
    	return *(data+empl);
    }	
     
    template<class T>
    T& Vecteur<T>::retireElement(int empl)
    {
    	*(occupation+empl)=0;
     
    	return *(data+empl);
    }
     
    template class Vecteur<int>;
    template class Vecteur<Client>;
    template class Vecteur<MembrePersonnel>;
    template class Vecteur<ContratAssurance>;
    template class Vecteur<ContratAssuranceVehicule>;
    template class Vecteur<Vehicule>;
    Merci d'avance

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Formellement, push_back rajoute un élément à la fin du conteneur. Avec ta classe, il peut être remplacer par ton setElement.
    Quelques remarques sur ta classe:
    -> Elle ne gère pas correctement l'echec d'allocation dans le constructeur (cf ici).
    -> Ton constructeur par copie est incorrect (data et occupation ne sont pas contruits)
    -> Ton opérateur = n'est pas celui qu'on attendrait.
    -> il existe bool pour les valeurs true/false. Pourquoi utiliser un int pour occupation?
    -> Réminiscence du C : partout tu fais *(ptr+indice) au lieu de ptr[indice]?
    -> Tu ne teste jamais la validité des indices
    -> Attention à la séparation entre .h et .cpp pour les templates

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Et si j'utilise realloc? ca peut marcher?

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    -> Elle ne gère pas correctement l'echec d'allocation dans le constructeur (cf ici).
    -> Ton constructeur par copie est incorrect (data et occupation ne sont pas contruits)
    -> Ton opérateur = n'est pas celui qu'on attendrait.
    Je ne vois pas ce que vous dites là?

    et aussi je viens de voir que ce qui serait cool pour ma classe vecteur c'est la fonction resize de vector mais moi je dois utiliser ma classe pas la classe vector donc est-ce qu'il existe autre chose pour resize?

    merci
    Ju

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 20/10/2006, 13h19
  2. Accès le plus rapide: Pointeur ou tableau?
    Par homeostasie dans le forum C
    Réponses: 21
    Dernier message: 01/09/2006, 14h08
  3. [VB.NET] Pointeur vers tableau
    Par b_lob dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/08/2006, 16h06
  4. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 00h34
  5. Pointeur et TAbleau
    Par melmouj dans le forum C
    Réponses: 20
    Dernier message: 25/09/2005, 16h13

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