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
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans news:, Gabriel Dos
| > Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en
| > prétendant que le code devient ainsi correct fait un raisonnement
| > stupide qui ne peut provenir d'un professionnel ; ou alors c'est un
|
| En pratique (ce qui est souvent le point de vue de James), je
| ne sais pas si stupide est la seule possibilité :-) En fait,

En pratique les bibliothèques offrent maintenant des [] qui valident
l'accès. Alors en pratique, cela va marcher les jours pairs de pleine
lune. C'est ça un programme correct raisonné et écrit par un
professionnel ?

-- Gaby
Avatar
Michel Michaud
Dans news:, Gabriel Dos
"Michel Michaud" writes:

Dans news:, Gabriel
Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en
prétendant que le code devient ainsi correct fait un raisonnement
stupide qui ne peut provenir d'un professionnel ; ou alors c'est
un


En pratique (ce qui est souvent le point de vue de James), je
ne sais pas si stupide est la seule possibilité :-) En fait,


En pratique les bibliothèques offrent maintenant des [] qui valident
l'accès. Alors en pratique, cela va marcher les jours pairs de
pleine lune. C'est ça un programme correct raisonné et écrit par un
professionnel ?


Si c'est le cas non évidemment. Mais si le code ne fonctionne qu'avec
[], qu'il n'y a pas d'alternative, que la documentation indique que
ça fonctionne, etc., alors le professionnel ne dit pas à son patron
que c'est impossible à faire... En tout cas, j'imagine que ce serait
le point de vue de James (personnellement j'irais bidouiller dans la
bibliothèque, le code objet, n'importe quoi pour permettre une
alternative !).

Tu connais le vieil adage (romain paraît-il) « Celui qui dit que
c'est impossible à faire ne devrait pas nuire à celui qui est en
train de le faire »...

--
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
"Michel Michaud" writes:

| Dans news:, Gabriel Dos
| > "Michel Michaud" writes:
| >
| >> Dans news:, Gabriel
| >>> Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en
| >>> prétendant que le code devient ainsi correct fait un raisonnement
| >>> stupide qui ne peut provenir d'un professionnel ; ou alors c'est
| >>> un
| >>
| >> En pratique (ce qui est souvent le point de vue de James), je
| >> ne sais pas si stupide est la seule possibilité :-) En fait,
| >
| > En pratique les bibliothèques offrent maintenant des [] qui valident
| > l'accès. Alors en pratique, cela va marcher les jours pairs de
| > pleine lune. C'est ça un programme correct raisonné et écrit par un
| > professionnel ?
|
| Si c'est le cas non évidemment. Mais si le code ne fonctionne qu'avec
| [], qu'il n'y a pas d'alternative,

(1) si le code ne fonctionne qu'avec [] et pas at(), il y a un
problème fondamental avec le programme;

(2) ici, il y aune alternative.


-- Gaby
Avatar
kanze
Gabriel Dos Reis wrote in message
news:...
James Kanze writes:
| Gabriel Dos Reis writes:
| |> James Kanze writes:
| |> | Gabriel Dos Reis writes:
| |> | |> "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.

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

| |> | Parce que dans la pratique, il ne lève pas d'exception ?

| |> Et alors ?

| C'est une raison potentielle. Il y a bien des moments où il faut
| savoir qu'une fonction ne lève pas d'exception -- sinon, le code
| correct n'est pas possible.

Et dans ce cas précis, le code ne devient pas subitement correct parce
que tu as remplacé v.at(i) par v[i]. Si, v,ay(i) lève une exception,
c'est que i n'est pas une bonne valeur pour indexer le tableau. C'est
simple.


Et on s'est malentendu, comme d'habitude. Je suis tout à fait d'accord
que changer un v.at(i) en v[i] ne peut pas rendre du code correct s'il
ne l'était pas avant -- pire, il pourrait le rendre incorrect, si
l'utilisateur était bien préparé pour l'exception, et y compter.

En fait, je répondais hors du contexte, à ta phrase, prise dans
l'isolation. Et je reconnais que pris en contexte, ma réponse prète à
confusion. Tout ce que je voulais dire, c'est qu'il y a éventuellement
des cas où on préfèrerait v[i] à v.at(i).

| |> Tu raisonnes comme les élèves qui se contentent de mettre leurs
| |> programmes en commentaire... parce que le compilateur leur a dit
| |> qu'il y avait une erreur de syntaxe.

| Ou comme un professionnel qui doit écrire du code qui marche avec
| des compilateurs réels.

Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en prétendant
que le code devient ainsi correct fait un raisonnement stupide qui ne
peut provenir d'un professionnel ; ou alors c'est un professionnel
qu'il faut vite enlever du circuit parce qu'il représente un vrai
danger public.


Tout à fait, et ce n'est pas ce que je voulais dire.

En plus, je suis obligé à reconnaître que la manque de communication est
tout à fait ma faute. En rélisant ta phrase en contexte, je ne peux
qu'être d'accord.

Ce n'est pas une question de garantie donnée par la norme. Le fait que
v.at(i) lève une exception indique un problème avec la valeur i ou
l'indexation. Écrire v[i] ne rend pas le code plus correct.

Et dans la vie concrète, tu vas tomber sur des bibliothèques qui font
quand même du range checking pouor v[i].


Oui. La STLPort, par exemple, ou les versions récentes de la
bibliothèque Dinkumware. (Avec le compilateur dont je suis obligé de me
servir actuellement, il y a aussi du range checking pour v[i]. Mais
c'est parce que le compilateur est tellement ancien qu'il ne supporte
pas std::vector, et que j'ai mes propres classes de tableau.)

Plus général, si une exception ferait que le programme ne marche pas, je
ne vois pas l'intérêt d'utiliser v.at(i). Si i n'est pas valide, le
programme ne marche pas, quelque soit la forme utilisée. (Encore plus
général, je n'utilise pour ainsi dire jamais v.at(i). Parce que si je
suis près à accepter un i plus grand, je l'accepte, sans exception, en
le testant et en faisant quelque chose d'autre, et si elle ne l'est pas,
j'ai un assert( i < v.size() ) immédiatement avant l'accès ; je n'ai
donc pas besoin du test qui de toute façon ne ferait pas ce que je
veux.)

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
kanze
"Michel Michaud" wrote in message
news:<cBKAb.1578$...
Dans news:, Gabriel Dos

Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en
prétendant que le code devient ainsi correct fait un raisonnement
stupide qui ne peut provenir d'un professionnel ; ou alors c'est un


En pratique (ce qui est souvent le point de vue de James), je
ne sais pas si stupide est la seule possibilité :-) En fait,
je pense à quelque chose du genre de

void MonSuperTriSurTableauDeInt(int* debut, int* fin);

vector<int> v;
// ...
// Il y a maintenant >= nbElem dans mon v, mais je veux
// trier nbElem au maximum
MonSuperTriSurTableauDeInt(&v[0], &v[nbElem]);

S'il y a exactement nbElem, at(nbElem) lève une exception avant qu'on
puisse en prendre l'adresse... Avec [nbElem], c'est moins dangereux
(bien que risqué en C++).


De point de vue de l'exception safety, c'est beaucoup moins dangereux.
Parce qu'avec les bibliothèques dont je me sers professionnellement
actuellement, [nbElem] provoque un échec d'une assertion. Pas de
problème d'exception safety, mais ce n'est pas une solution pratique
pour que l'application marche non plus.

Ceci dit, je règlerais le problème avec (&v.at(0) + nbElem), mais
c'est une autre histoire.

Je ne dis pas que l'un de vous deux a raison et l'autre non, je n'ai
pas d'avis pour le moment :-) Sauf que je n'aime pas « at » en
général, j'aurais vraiment préféré [] avec validation et at pour
optimisation. Dans ce cas, j'ai l'impression que vous seriez peut-être
d'accord pour utiliser []...


La question que je me pose, c'est ce qu'il faut faire en cas d'erreur.
En gros, avec [], je m'attends à un échec d'assertion ; avec at, avec
une exception que je ne suis pas forcemment près à traiter.

Dans mes propres classes de tableau, il y a actuellement trois
possibilités prévues :

[] échec de l'assertion en cas d'erreur
at() exception en cas d'erreur, et
unsafeAt() pas de vérification, pour le cas où le profiler dit
qu'il faut.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
kanze
Gabriel Dos Reis wrote in message
news:...
"Michel Michaud" writes:

| Dans news:, Gabriel Dos
| > "Michel Michaud" writes:

| >> Dans news:, Gabriel
| >>> Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en
| >>> prétendant que le code devient ainsi correct fait un
| >>> raisonnement stupide qui ne peut provenir d'un professionnel ;
| >>> ou alors c'est un

| >> En pratique (ce qui est souvent le point de vue de James), je ne
| >> sais pas si stupide est la seule possibilité :-) En fait,

| > En pratique les bibliothèques offrent maintenant des [] qui
| > valident l'accès. Alors en pratique, cela va marcher les jours
| > pairs de pleine lune. C'est ça un programme correct raisonné et
| > écrit par un professionnel ?

| Si c'est le cas non évidemment. Mais si le code ne fonctionne qu'avec
| [], qu'il n'y a pas d'alternative,

(1) si le code ne fonctionne qu'avec [] et pas at(), il y a un
problème fondamental avec le programme;

(2) ici, il y aune alternative.


Et
(3) il y a toujours une alternative.

J'ai répondu à tort à Gaby, hors contexte. C'était une erreur de
communication, et la faute en est la mienne.

Mais je n'apprécie pas que Michel puisse penser que je pourrais être
assez amateur pour écrire quelque chose du genre &v[nbElem] simplement
parce que je savais que mon implémentation (aujourd'hui) n'effectuait
pas de vérification.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Gabriel Dos Reis
writes:

| > | |> Tu raisonnes comme les élèves qui se contentent de mettre leurs
| > | |> programmes en commentaire... parce que le compilateur leur a dit
| > | |> qu'il y avait une erreur de syntaxe.
|
| > | Ou comme un professionnel qui doit écrire du code qui marche avec
| > | des compilateurs réels.
|
| > Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en prétendant
| > que le code devient ainsi correct fait un raisonnement stupide qui ne
| > peut provenir d'un professionnel ; ou alors c'est un professionnel
| > qu'il faut vite enlever du circuit parce qu'il représente un vrai
| > danger public.
|
| Tout à fait, et ce n'est pas ce que je voulais dire.

Alors, je pousse un grand OUF, et je suis rassuré.

-- Gaby
Avatar
Alain Naigeon
"Gabriel Dos Reis" a écrit dans le message
news:
writes:

| > | |> Tu raisonnes comme les élèves qui se contentent de mettre leurs
| > | |> programmes en commentaire... parce que le compilateur leur a dit
| > | |> qu'il y avait une erreur de syntaxe.
|
| > | Ou comme un professionnel qui doit écrire du code qui marche avec
| > | des compilateurs réels.
|
| > Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en prétendant
| > que le code devient ainsi correct fait un raisonnement stupide qui ne
| > peut provenir d'un professionnel ; ou alors c'est un professionnel
| > qu'il faut vite enlever du circuit parce qu'il représente un vrai
| > danger public.
|
| Tout à fait, et ce n'est pas ce que je voulais dire.

Alors, je pousse un grand OUF, et je suis rassuré.

-- Gaby


Pourquoi, tu as commandé un projet à James, petit cachotier ? :-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Gabriel Dos Reis
"Alain Naigeon" writes:

| "Gabriel Dos Reis" a écrit dans le message
| news:
| > writes:
| >
| > | > | |> Tu raisonnes comme les élèves qui se contentent de mettre leurs
| > | > | |> programmes en commentaire... parce que le compilateur leur a dit
| > | > | |> qu'il y avait une erreur de syntaxe.
| > |
| > | > | Ou comme un professionnel qui doit écrire du code qui marche avec
| > | > | des compilateurs réels.
| > |
| > | > Excuse-moi, mais quelqu'un qui remplace v.at(i) par v[i] en prétendant
| > | > que le code devient ainsi correct fait un raisonnement stupide qui ne
| > | > peut provenir d'un professionnel ; ou alors c'est un professionnel
| > | > qu'il faut vite enlever du circuit parce qu'il représente un vrai
| > | > danger public.
| > |
| > | Tout à fait, et ce n'est pas ce que je voulais dire.
| >
| > Alors, je pousse un grand OUF, et je suis rassuré.
| >
| > -- Gaby
|
| Pourquoi, tu as commandé un projet à James, petit cachotier ? :-)

Je ne fais pas tant de choses que ça en cachette :-)

Non, l'idée de retirer James du circuit me pose quelques problèmes ;-p

-- Gaby
Avatar
Michel Michaud
Dans news:,
Mais je n'apprécie pas que Michel puisse penser que je pourrais être
assez amateur pour écrire quelque chose du genre &v[nbElem]
simplement parce que je savais que mon implémentation (aujourd'hui)
n'effectuait pas de vérification.


Alors tu apprécieras de savoir que ce n'est pas ce que j'ai dit.

J'ai dit que s'il n'y a pas d'alternative (et je parlais en général,
pas seulement de [] vs at), tu vas choisir ce qui fonctionne plutôt
que ce qui serait mieux mais ne fonctionne pas. C'est ce que j'ai
compris de ton choix <iostream.h> vs <iostream> entre autres. Tu
dois t'arranger pour que tes programmes fonctionnent parfaitement,
avec les limites et les possibilités des outils mis à ta
disposition. Je fais erreur ?

--
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