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 :

[vecteur] passage d'adresse


Sujet :

C++

  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut [vecteur] passage d'adresse
    hello,

    Peut passer une adresse d'un vecteur de la meme manière que celle d'un tableau, dans le but de permettre à un autre objet d'aller lire (lecture seule) la collection sans recopie ?

    merci d'avance


    PS peut etre ai je meilleure temps de faire un vecteur de ptr et de recopier le vecteur puique que je fais de la lecture seule ?
    Pour les details, cherche tout seul !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Peut passer une adresse d'un vecteur de la meme manière que celle d'un tableau, dans le but de permettre à un autre objet d'aller lire (lecture seule) la collection sans recopie ?
    Pourquoi ne pas simplement essayer ? (bon, la réponse étant quand même "oui"). Tu peux même utiliser un passage par référence, ce sera encore mieux.

    PS peut etre ai je meilleure temps de faire un vecteur de ptr et de recopier le vecteur puique que je fais de la lecture seule ?
    Surtout pas.

  3. #3
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Je ne suis pas certain du tout de ce que tu veux faire. Mais sache à tout hasard qu'une fonction prenant en paramètre un pointeur sur un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void f(T* t, int nbElem);
    Peut être appelée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<T> v;
    f(&v[0], v.size());
    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.

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par JolyLoic
    Je ne suis pas certain du tout de ce que tu veux faire. Mais sache à tout hasard qu'une fonction prenant en paramètre un pointeur sur un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void f(T* t, int nbElem);
    Peut être appelée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vector<T> v;
    f(&v[0], v.size());
    Je ne m'y risquerais pas. L'adresse de v[0] n'est pas, il me semble, garantie d'être constante durant l'exécution de f(). En fait elle ne l'est pas si le vecteur risque d'être modifié durant la fonction.
    En revanche avec ceci, il y a probablement moins de risque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void f(const T* t, int nbElem);

  5. #5
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Avec ton écriture, on empêche de modifier les éléments du vecteur. Mais modifier ces éléments n'a aucune incidence. C'est ajouter/enlever des éléments qui pourrait causer problème, ce que la fonction n'est pas à même de faire, sauf si elle connait v par ailleurs.
    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.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    A priori on ne sait pas de quelle manière la fonction agit sur les objets, ni dans le cas actuel si les objets agissent sur le vecteur.

    Exemple :
    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
     
    class Class
    {
    	vector<Class> &v;
    public:	
    	Class(vector<Class> &vect) : v(vect) {}
    	Class(const Class &c) : v(c.v) {}
    	~Class() {}
    	Class & operator = (Class &) {}
    	Class & operator ++ (void)
    	{
    		v.push_back(*this);
    		return *this;
    	}
    };
     
    template<class T>
    void test(T *t, int ne)
    {
    	for (int i = 0; i < ne; ++i, ++t) ++*t;
    }
     
    int main(void)
    {
    	vector<Class> v;
    	Class c(v);
    	for (int k = 0; k < 5; ++k) v.push_back(c);
    	test<Class>(&(v[0]), v.size());
    	return 0;
    }
    Il y a donc un dangers, qu'il est bon de signaler

  7. #7
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Ok. D'ailleurs, ce problème peut aussi apparaître avec ta signature pour f...

    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
    struct ALaCon
    {
       vector<ALaCon> *v;
    };
     
    void f(const ALaCon* t, int nbElem)
    {
      ALaCon a;
      t->v->push_back(a);
    }
     
    int main()
    {
     vector<ALaCon> v;
     ALaCon a;
     a.v = &v;
     v.push_back(a) ;
     f(&v[0],1);
    }
    Ou plus simple encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int f(T const * t, int nbElem, vector<T> v)
    Pour peu que le troisième élément réfère au même tableau que le premier, on peut avoir des surprises.


    Il n'est reste pas moins que le code marche dans les cas non pathologiques, et que ce qui est important, c'est de savoir que la valeur retournée par &v[0] n'est valide que jusqu'à la prochaine modification du nombre d'éléments du vector, ce qu'aucune déclaration de fonction n'est capable d'assurer.
    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.

Discussions similaires

  1. Problème de passage d'adresses
    Par peijnoob dans le forum C
    Réponses: 6
    Dernier message: 17/10/2006, 16h09
  2. passage par adresse
    Par gloubig dans le forum C++
    Réponses: 1
    Dernier message: 20/05/2006, 06h35
  3. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29
  4. passage par adresse
    Par cari dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/02/2006, 11h33
  5. [Debutant(e)]passage par adresse?
    Par cap2fosse dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2004, 10h05

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