OVH Cloud OVH Cloud

Obtenir l'adresse d'un élément de vecteur

36 réponses
Avatar
Marc
Bonjour,
j'utilise des vecteurs du type

vector<ClassA> mon_vecteur;

Dans une fonction, j'ai besoin de passer comme paramètre l'adresse d'un
élément du vecteur (c'est comme ça...), c'est à dire un paramètre du type
ClassA*.
Quand je tente
&mon_vecteur.at(i)
ça plante.
Quelqu'un sait pourquoi ?
En fait j'ai besoin de stocker quelque part les adresses des éléments du
vecteur.
Merci
Marc

10 réponses

1 2 3 4
Avatar
Vincent Richard

vector<ClassA> mon_vecteur;

Dans une fonction, j'ai besoin de passer comme paramètre l'adresse d'un
élément du vecteur (c'est comme ça...), c'est à dire un paramètre du type
ClassA*.
Quand je tente
&mon_vecteur.at(i)


&(mon_vecteur[i])

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
Fabien LE LEZ
On Fri, 5 Dec 2003 18:31:14 +0100, "Marc" wrote:

Quand je tente
&mon_vecteur.at(i)
ça plante.


Qu'entends-tu par "ça plante" ? Core dump ? Exception ?


--
;-)

Avatar
Zouplaz
Marc - :

En fait j'ai besoin de stocker quelque part les adresses des éléments du
vecteur.


Et tu es sur qu'il n'y a pas le moindre risque qu'elle change en cours de
route (redimensionnement du vecteur, soupe interne réalisée sans que tu en
sois averti) ?

Avatar
Ivan Vecerina
"Marc" wrote in message
news:3fd0c154$0$7157$
Quand je tente
&mon_vecteur.at(i)
ça plante.
Quand et comment? l'appel en soi est correct.

Quelqu'un sait pourquoi ?
Si l'appel même à at() plante (en lançant une exception), le problème

sera corrigé en t'assurant que 0 <= i <= mon_vecteur.size() .
Comment le vecteur est-il alloué ?
[ dans ce cas, utiliser mon_vecteur[i] masquera
dangereusement le problème ]
Si la plantée est ultérieure:

En fait j'ai besoin de stocker quelque part les adresses des éléments du
vecteur.
Il faut être prudent dans ce cas: l'ajout d'un élément peut invalider

toutes les adresses des éléments précédemment stoqués (il se peut
que le tableau interne utilisé par mon_vecteur doive être réalloué).
Un exemple de code plus complet permettrait de discuter des solutions
possible (p.ex. utiliser une autre collection, std::deque ou std::list).


Amicalement,
Ivan
--
http://ivan.vecerina.com/contact/?subject=NG_POST <- e-mail contact form

Avatar
Alexandre
"Marc" a écrit dans le message de
news:3fd0c154$0$7157$
Bonjour,
j'utilise des vecteurs du type

vector<ClassA> mon_vecteur;

Dans une fonction, j'ai besoin de passer comme paramètre l'adresse d'un
élément du vecteur (c'est comme ça...), c'est à dire un paramètre du type
ClassA*.
Quand je tente
&mon_vecteur.at(i)
ça plante.
Quelqu'un sait pourquoi ?
En fait j'ai besoin de stocker quelque part les adresses des éléments du
vecteur.
Merci
Marc



Bonjour,
ça me parait dangereux de travailler avec l'adresse d'un élément de vecteur
: elle risque de changer durant la vie de celui-ci... Pourquoi donc veux-tu
la passer en adresse ?

Avatar
espie
In article ,
Zouplaz wrote:
Marc - :

En fait j'ai besoin de stocker quelque part les adresses des éléments du
vecteur.


Et tu es sur qu'il n'y a pas le moindre risque qu'elle change en cours de
route (redimensionnement du vecteur, soupe interne réalisée sans que tu en
sois averti) ?


Si je ne m'abuse, ca fait partie des defect reports de la norme, et des
assurances qui ont ete donnees depuis: on peut prendre l'adresse d'un
element de vector<T>, ca marche de la facon dont on s'attend, et ca ne
bouge pas tout seul tant qu'on ne joue pas (implicitement ou explicitement)
avec .reserve().

Gaby pourra sans doute nous en dire plus.


Avatar
benoit.breholee

&(mon_vecteur[i])


Est-ce que &(mon_vecteur[0]) peut être considéré comme l'adresse d'un
tableau C contenant les éléments du vecteur ? (toujours avec les mêmes
précautions : pas de modifications du vecteur, etc.)

Avatar
Michel Michaud
Dans news:, Benoît
Vincent Richard a

&(mon_vecteur[i])


Est-ce que &(mon_vecteur[0]) peut être considéré comme l'adresse
d'un tableau C contenant les éléments du vecteur ? (toujours avec
les mêmes précautions : pas de modifications du vecteur, etc.)


Oui, en autant que les éléments auxquels tu fais référence existent.
Ce n'était pas tout à fait garanti par la norme, mais ça l'est
maintenant.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Gabriel Dos Reis
--=-=- Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8bit

"Michel Michaud" writes:

| Dans news:, Benoît
| > Vincent Richard a
| >
| >> &(mon_vecteur[i])
| >
| > Est-ce que &(mon_vecteur[0]) peut être considéré comme l'adresse
| > d'un tableau C contenant les éléments du vecteur ? (toujours avec
| > les mêmes précautions : pas de modifications du vecteur, etc.)
|
| Oui, en autant que les éléments auxquels tu fais référence existent.
| Ce n'était pas tout à fait garanti par la norme, mais ça l'est
| maintenant.

--=-=- Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit


Mais je ne vois toujours pas l'intérêt ici de préférer v[i] à v.at(i).

-- Gaby

--=-=-=--
Avatar
Michel Michaud
"Michel Michaud" writes:
Dans news:, Benoît
Est-ce que &(mon_vecteur[0]) peut être considéré comme l'adresse
d'un tableau C contenant les éléments du vecteur ? (toujours avec
les mêmes précautions : pas de modifications du vecteur, etc.)


Oui, en autant que les éléments auxquels tu fais référence
existent. Ce n'était pas tout à fait garanti par la norme, mais
ça l'est maintenant.



Mais je ne vois toujours pas l'intérêt ici de préférer v[i] à
v.at(i).


Moi non plus (ni vice versa d'ailleurs), mais je ne savais pas que
c'était ici la question.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



1 2 3 4