OVH Cloud OVH Cloud

Contigüité des éléments d'un `std::vector´

167 réponses
Avatar
drkm
Je viens de tomber sur un message de Michel, d'il y a un mois, dont
voici un extrait :

> From: "Michel Michaud" <mm@gdzid.com>
> Subject: Re: buffer et std::vector<char> passage de l'un a l'autre
> Message-ID: <pQnHa.816$5d.225371@news20.bellglobal.com>
> Date: Mon, 16 Jun 2003 14:16:52 -0400

> Avec

> vector<char> v(taille);

> &v[0] est un char* qui peut être passé aux fonctions attendant un
> char[]/char*. La norme ne dit pas explicitement que les char sont
> contigus, mais c'est un fait et il y a une correction à la norme qui
> l'indique aussi.

J'avais toujours entendu dire que la contigüités des éléments d'un
vecteur était garantie. Apparemment non. Pour ce qui est de la
correction à la norme, je suppose que tu parlais d'un DR. En as-tu la
référence, stp ?

--drkm

10 réponses

Avatar
James Kanze
Gabriel Dos Reis writes:

|> James Kanze writes:

|> | Gabriel Dos Reis writes:

|> | |> juste pour confronter à la réalité
|> | |> concrète. Mais je présume que ce n'est pas la peine,
|> | |> puisque cela fait pschitttt tout seul.

|> | Qu'il le fasse s'il veuille. Je ne vois pas où ça
|> | changerait quelque chose. En attendant, j'aimerais bien voir une
|> | indication que quelqu'un (n'importe qui) y avait pensé avant
|> | que la question soit soulevée.

|> Et pourquoi refuses-tu de regarder les archives ?

Parce que je n'en ai pas accès. (Je n'en ai pas le temps non plus.)

[...]
|> | C'est ce qu'on a dit. Mais ça veut dire quoi « implicite
|> | dans la tête de ceux qui ont activement contribué ... »
|> | ? Qu'ils y ont consciemment pensé ?

|> que cela leur était évident.

Mais quoi, au juste, était évident ? C'est là la question.
Que une implémentation va se faire avec de la mémoire contigue,
ou que ce soit une obligation de le faire comme ça.

|> L'un d'eux a constamment conseillé de préférer
|> std::vector<T> aux T[].

Moi, aussi, j'ai constamment conseillé de préférer
std::vector<T> aux T[]. Y compris à l'époque où il ne me
venait pas à l'esprit que la contiguïté pouvait être une
obligation.

|> [...]

|> | |> C'est fascinant lorsque tu réécris l'histoire.

|> | Dans ce cas-ci, je ne démande que d'y croire ; je suis pour
|> | la contiguïté, moi aussi. Seulement, d'après toute
|> | l'évidence.

|> La question n'est pas si tu es pour la contiguité ou non. La
|> question concerne l'assertion diffamatoire que tu as faite.

Je répète, je n'ai pas l'impression d'avoir insulté qui que
ce soit. À leur place, j'aurais fait exactement pareil ; je ne vais
donc pas le considérer comme une critique.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Gabriel Dos Reis
James Kanze writes:

| Gabriel Dos Reis writes:
|
| |> James Kanze writes:
|
| [...]
|
| |> | C'est assez évident que ce n'était pas comment l'entendait
| |> | tout le monde, mais j'aimerais simplement de l'évidence qu'il
| |> | y avait même une seule personne dont l'intention était que
| |> | les vector soient obligatoirement contigu.
|
| |> Ne sois pas ridicule, tu as accès aux archives. Regarde les.
|
| D'abord, je n'ai pas accès aux archives. Pas actuellement, en tout
| cas. Deuxièmement, ce que j'ai dit est trivialement vrai -- tout le
| monde ne s'entendait pas que vector soit obligatoirement
| contigu. Triviallement, parce que je connais au moins une personne qui
| ne s'en doutait pas du tout que ce soit une exigence -- moi-même.

ah ben voyons.

| Mais ce que je démande, c'est des preuves (assez lache,
| d'ailleurs), qu'il y avait des gens qui avaient consciemment
| l'intention que ce soit une obligation. (Qu'il y avait des gens qui
| n'en avaient pas du tout pensé, je le crois bien.)

C'est simple, le sujet a été discuté sur le réflecteur du
comité. Parmi les intervenants, des gens qui ont été actifs dans
l'adoption de la STL dans la norme et dans ses diverses
implémentations ont dit que pour eux, il ne faisait aucun doute ce
devait être contigu. Si tu lis les archives, tu verras que certains
ont soulévé la question suivante : puisque les auteurs actifs ont
oublié de mettre explicitement cette garantie, et puisqu'il n'y a rien
qui permet de l'inférer, est-ce qu'on peut prendre cette opportunité
pour permettre des vector non contigus ? Cela a été longuement
débattu, les mérites, les implications, ... Finalement le LWG a
proposé qu'on fasse ce qui n'aurait jamais dû être oublié d'être fait
et refleter la pratique.

Tu sais bien les règles qui couvrent les débats sur les réflecteurs du
comité et que je ne peux pas les reproduire ici.

C'est aussi l'une des raisons pour lesquelles je t'exortes à lire
*attentivement* ce que BS écrit sur les std::vector -- puisqu'une
preuve lâche te suffirait et qu'il est l'un des auteurs actifs de
l'adoption de la STL dans la norme.

[...]

| |> Là encore, tu peux le lire -- j'ai déjà parié avec ma
| |> souris que tu rejèteras l'idée.
|
| En fait, je suis tout à fait d'accord avec Stroustrup ici.

nomdedieou !

|
| |> | |> C'est l'une des raisons de plus pour que je considère ton
| |> | |> affirmation comme un delire de plus, et que tu n'admettras
| |> | |> jamais son caractère diffamatoire.
|
| |> | Si la vérité est diffamatoire, qu'il en soit ainsi.
|
| |> Là on atteint le fond. N'en ajoute plus.
|
| C'est quoi, au fond, que tu n'aimes pas ? La vérité ?

J'aime la vérité, c'est pour cela que je dénonce tes assertions
diffamatoires.

| |> | En fait, je crois que le fait que le comité se compose
| |> | d'êtres humains, et se comporte comme un groupe d'êtres
| |> | humains, ne soit pas particulièrement diffamatoire.
|
| |> Clairement ce n'était pas l'affirmation sous discussion.
|
| L'affirmation, c'est que le comité a trouvé un moyen
| d'améliorer std::vector, à un coût quasi-null, et qu'il en a
| profité. Qu'il a fallu masquer un peu d'innovation dans les
| spécifications (mais qui n'en était pas dans les
| implémentations) derrière des « intentions » non
| exprimées, c'est une astuce que je ne critique pas.

L'affirmation est :

*on a inventé que c'était l'intention*, et qu'on a oublié de le
préciser, tellement ça paraissait évident.

-- Gaby
Avatar
Gabriel Dos Reis
James Kanze writes:

| |> | C'est ce qu'on a dit. Mais ça veut dire quoi « implicite
| |> | dans la tête de ceux qui ont activement contribué ... »
| |> | ? Qu'ils y ont consciemment pensé ?
|
| |> que cela leur était évident.
|
| Mais quoi, au juste, était évident ? C'est là la question.

qu'un std::vector stockait ses éléments de manière contigüe.

[...]

| |> | |> C'est fascinant lorsque tu réécris l'histoire.
|
| |> | Dans ce cas-ci, je ne démande que d'y croire ; je suis pour
| |> | la contiguïté, moi aussi. Seulement, d'après toute
| |> | l'évidence.
|
| |> La question n'est pas si tu es pour la contiguité ou non. La
| |> question concerne l'assertion diffamatoire que tu as faite.
|
| Je répète, je n'ai pas l'impression d'avoir insulté qui que
| ce soit. À leur place, j'aurais fait exactement pareil ; je ne vais
| donc pas le considérer comme une critique.

peut-être qu'à leur place, tu aurais *inventé* que c'était implicit.
Mais 1) tu n'es pas à leur place
2) j'en connais au moins un qui n'a pas inventé cette histoire.

-- Gaby
Avatar
Gabriel Dos Reis
James Kanze writes:

| Gabriel Dos Reis writes:
|
| |> James Kanze writes:
|
| |> | Gabriel Dos Reis writes:
|
| |> | |> James Kanze writes:
|
| |> | [...]
|
| |> | |> | C'est assez évident que ce n'était pas comment
| |> | |> | l'entendait tout le monde, mais j'aimerais simplement de
| |> | |> | l'évidence qu'il y avait même une seule personne
| |> | |> | dont l'intention était que les vector soient
| |> | |> | obligatoirement contigu.
|
| |> | |> Ne sois pas ridicule, tu as accès aux archives. Regarde
| |> | |> les.
|
| |> | D'abord, je n'ai pas accès aux archives. Pas actuellement, en
| |> | tout cas. Deuxièmement, ce que j'ai dit est trivialement vrai
| |> | -- tout le monde ne s'entendait pas que vector soit
| |> | obligatoirement contigu. Triviallement, parce que je connais au
| |> | moins une personne qui ne s'en doutait pas du tout que ce soit
| |> | une exigence -- moi-même.
|
| |> ah ben voyons.
|
| Tu ne vas pas te mettre à douter mes appréciations de ce que je
| pense moi-même, j'espère.

ah ben non.

| |> | Mais ce que je démande, c'est des preuves (assez lache,
| |> | d'ailleurs), qu'il y avait des gens qui avaient consciemment
| |> | l'intention que ce soit une obligation. (Qu'il y avait des gens
| |> | qui n'en avaient pas du tout pensé, je le crois bien.)
|
| |> C'est simple, le sujet a été discuté sur le réflecteur
| |> du comité. Parmi les intervenants, des gens qui ont été
| |> actifs dans l'adoption de la STL dans la norme et dans ses
| |> diverses implémentations ont dit que pour eux, il ne faisait
| |> aucun doute ce devait être contigu. Si tu lis les archives, tu
| |> verras que certains ont soulévé la question suivante :
| |> puisque les auteurs actifs ont oublié de mettre explicitement
| |> cette garantie, et puisqu'il n'y a rien qui permet de
| |> l'inférer, est-ce qu'on peut prendre cette opportunité pour
| |> permettre des vector non contigus ? Cela a été longuement
| |> débattu, les mérites, les implications, ... Finalement le
| |> LWG a proposé qu'on fasse ce qui n'aurait jamais dû être
| |> oublié d'être fait et refleter la pratique.
|
| J'ai l'impression que je m'explique mal. Je sais à peu près ce
| que tu viens de dire -- je l'ai lu par ailleurs.
|
| Ce que je dis, c'est que les intentions après coup, c'est une
| trouvaille.

et ce que je te dis, c'est que dans ce cas précis, ce n'est pas une
invention après coup.

| Il arrive bien qu'on en discute quelque chose, et puis,
| pour une raison ou une autre, ça n'apparaît pas dans la version
| finale de la norme. Mais ici, j'ai plutôt l'impression que
| vraiment, personne n'y a donné la moindre reflection, peut-être,
| comme tu dis, parce que ça leur était évident. Mais en fait,
| et je répète, qu'est-ce qui leur était évident. Il m'est
| aussi évident que la seule implémentation raisonable de
| std::vector utilise en fait la mémoire contiguë. Mais ce n'est
| pas la même chose que dire qu'il est évident qu'on veut
| interdire une implémention qui ne l'utilise pas.
|
| |> Tu sais bien les règles qui couvrent les débats sur les
| |> réflecteurs du comité et que je ne peux pas les reproduire
| |> ici.
|
| Ce qui ne t'a pas empéché de le faire dans la passée.

De citer messages des *réflecteurs* du comité ? Donne-moi des
références concrètes -- je ne me contenterais pas de « je n'ai plus
accès » ou « je n'ai pas le temps ».

[...]

| Mais j'ai bien l'impression de m'être mal exprimé. S'il n'y
| avait que toi, je me dirais que ça nous arrive, à nous deux.
| Mais j'ai l'impression que Michel aussi ressentait plus derrière ce
| que j'ai dit que je n'en voulais.

C'est à dire qu'en français, dire quelqu'un « a inventé » une
explication est plus proche de « a menti » que de toute autre
acception que tu tentes de faire passer dans le message auquel je suis
en train de répondre.

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

| "Gabriel Dos Reis" a écrit dans le
message

| news:
|
| >
| > Il n'a jamais fait un doute dans la tête de ceux qui ont travaillé
| > activement à l'adoption d'une partie de la STL dans la norme qu'un
| > std::vector<> devait garantir la contiguité.
| >
| > -- Gaby
|
| Question naïve : que faire de la notion d'adresse dans une
| librairie un peu abstraite ? Je m'explique :

la notion d'adresse est aussi abstraite. Où est le problème ?


Une abstraction consiste à prendre de la hauteur par rapport
à un niveau moins abstrait ; en l'occurrence, peux-tu expliquer
quel est le concept moins abstrait que l'adresse qui est englobé
par celle-ci ?
Pour ma part je te dirai que la notion de handle, rencontrée dans
mes petites aventures, est une abstraction de l'adresse, non ?
D'où le proverbe "on a toujours besoin de plus abstrait que soi" ;-)


| - d'une part, tu nous dis clairement qu'on peut compter
| sur cette contiguïté ;

Sans aucun doute.

| - d'autre part, il me semble que la seule façon de l'utiliser
| serait en quelque sorte "malpropre", c'est à dire par des
| calculs sur pointeurs avec des sizeof, etc - autrement dit

peux-tu expliquer cette utilisation de sizeof et en quoi ce serait
« malpropre » ?


Oui, le terme est un peu rude ; ce que j'appelle malpropre,
c'est d'agir sur une classe avec d'autres moyens que ceux
explicitement prévus dans son interface publique.

| en "court-circuitant" l'interface de std::vector puisque,
| sauf erreur de ma part (c'est ma question) cette propriété
| de contiguïté n'est pas modélisée (représentée) dans cette
| interface ?!

C'est de la sémantique. Et il y a beaucoup de sémantique qui ne sont
pas exprimée par de la syntaxe.


D'accord, mais il n'est jamais bon de renoncer avant d'avoir
essayé. La syntaxe, quand c'est possible, fait "remonter" les
erreurs à un niveau moins grave (échec de compilation au
lieu d'une exécution fautive).


| N'est -ce pas un peu choquant d'avoir une propriété dont
| la garantie d'existence n'est pas représentée dans l'interface
| de la classe - c'est une entorse à l'abstraction du type !?

Non.

Tout simplement, parce que tout ne se réduit pas à la syntaxe.


Attends, entendons-nous bien : si tu nommes "lire" une fonction
qui écrit, personne ne peut rien contre ça, nous sommes d'accord.
Mais il ne faut peut-être pas appeler sémantique tout ce qui échappe
à la syntaxe (faute de quoi une syntaxe incomplète, donc fautive,
serait toujours pardonnée).
AMHA la sémantique intervient quand une opération *représentée
dans la syntaxe* échoue dans certaines conditions de contexte
non modélisables par la syntaxe (exemple : lire sur une imprimante -
la lecture est représentée syntaxiquement, mais la nature du périph
ne l'est pas, dans ce cas).
Ici c'est différent : peux-tu me dire quelle fonction de l'interface
public de std:vector est susceptible d'échouer si les éléments sont
non contigus ? Je n'en vois aucune (sous réserve que l'*implémentation*
en tienne compte, évidemment).
Par conséquent, si l'interface public fonctionne même en l'absence
de contiguïté, alors c'est que c'est une propriété de l'implémentation,
et non du type défini par son interface public. En l'occurrence, je ne
dirais pas "sémantique" pour implémentation ;-) Mais bon, je suis sûr
que ce n'est pas ta position non plus...


| D'un autre côté je me demande moi-même comment
| représenter une telle propriété... après tout, cela concerne

C'est une garantie *sémantique*. Si i, j sont des entiers dans les
bornes alors

&v[i] == &v[j] + (i - j);

où « & » est addressof natif.

| en premier lieu *l'implémentation* d'un itérateur sur cette
| classe, mais à partir du moment où l'utilisateur peut avoir
| accès au "prochain" élément, en quoi cela l'intéresse-t-il
| de savoir où il se trouve par rapport au précédent ?

Parce que le monde ne tourne pas autour des itérateurs ?

std::vector<char> v(100);
std::cin.read(&v[0], v.size());

| Finalement j'arrive à formuler ma question sous sa forme la
| plus intéressante : en quoi cette contiguïté est-elle pertinente
| dans le contexte d'une classe munie d'un itérateur ? (dont
| l'usager, je me répète, n'a pas à savoir *comment* il itère).

Voir ci-dessus par exemple. Mais je suis certain que si tu regardes
d'autres codes avec des interfaces "C", tu verras l'utilité.



Ah mais voilà, "C", je suis d'accord - ce que j'appelais malpropre ;-)
Là tu vas rendre fou le type qui a passé des heures à concevoir
l'interface, puisque tu le court-circuite allègrement.
C'est bien évident que
std::cin.read(&v[0], v.size());
va échouer s'il n'y a pas contiguïté, mais cela n'est pas propre

pour moi. La façon propre serait de prévoir, dans l'interface public,
une fonction de lecture de n éléments ; après quoi, si l'implémenteur
décide qu'il y a contiguïté, il peut implémenter cette fonction avec
ta tournure, pour des raisons de simplicité et d'efficacité - mais je ne
vois pas en quoi cela doit concerner l'appelant.
Sans compter que, dans le cas que tu donnes en exemple, ça prouve
que la librairie manque de hauteur de vue (AMHA) : il est manifeste
qu'une classe template du genre chaine d'objets nous mettrait d'accord
tous les deux, et d'une façon élégante (tu aurais évidemment une
strstream qui ferait exactement le boulot ci-dessus) - et pourquoi est-elle
manquante, cette classe ?!!
(évidemment on pourrait spécialiser dans le cas de char pour préserver
l'efficacité de la string ordinaire).

--

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:
| > "Alain Naigeon" writes:
| >
| > | "Gabriel Dos Reis" a écrit dans le
| message
| > | news:
| > |
| > | >
| > | > Il n'a jamais fait un doute dans la tête de ceux qui ont travaillé
| > | > activement à l'adoption d'une partie de la STL dans la norme qu'un
| > | > std::vector<> devait garantir la contiguité.
| > | >
| > | > -- Gaby
| > |
| > | Question naïve : que faire de la notion d'adresse dans une
| > | librairie un peu abstraite ? Je m'explique :
| >
| > la notion d'adresse est aussi abstraite. Où est le problème ?
|
| Une abstraction consiste à prendre de la hauteur par rapport
| à un niveau moins abstrait ; en l'occurrence, peux-tu expliquer
| quel est le concept moins abstrait que l'adresse qui est englobé
| par celle-ci ?

le métal ?

| Pour ma part je te dirai que la notion de handle, rencontrée dans
| mes petites aventures, est une abstraction de l'adresse, non ?

C'est une autre *forme* d'adresse -- pas directement celle du langage
C++, mais elle est bien une forme d'adresse.

Il n'y a rien dans la norme qui interdit qu'une d'adresse d'un objet
dans un programme, ne soit pas en réalité mappée à une adresse URL
(qui elle-même est une abstraction).

| D'où le proverbe "on a toujours besoin de plus abstrait que soi" ;-)

oui, mais la pertinence ici est mince ;-)

| > | - d'une part, tu nous dis clairement qu'on peut compter
| > | sur cette contiguïté ;
| >
| > Sans aucun doute.
| >
| > | - d'autre part, il me semble que la seule façon de l'utiliser
| > | serait en quelque sorte "malpropre", c'est à dire par des
| > | calculs sur pointeurs avec des sizeof, etc - autrement dit
| >
| > peux-tu expliquer cette utilisation de sizeof et en quoi ce serait
| > « malpropre » ?
|
| Oui, le terme est un peu rude ; ce que j'appelle malpropre,
| c'est d'agir sur une classe avec d'autres moyens que ceux
| explicitement prévus dans son interface publique.

Sauf que l'interface de std::vector prévoit aussi de prendre l'adresse
de ses éléments.

| > | en "court-circuitant" l'interface de std::vector puisque,
| > | sauf erreur de ma part (c'est ma question) cette propriété
| > | de contiguïté n'est pas modélisée (représentée) dans cette
| > | interface ?!
| >
| > C'est de la sémantique. Et il y a beaucoup de sémantique qui ne sont
| > pas exprimée par de la syntaxe.
|
| D'accord, mais il n'est jamais bon de renoncer avant d'avoir
| essayé.

ce qui est bon ou mauvais dépend des personnes et a peu d'intérêt en
ce qui concerne C++ ou std::vector.

| La syntaxe, quand c'est possible, fait "remonter" les
| erreurs à un niveau moins grave (échec de compilation au
| lieu d'une exécution fautive).

La syntaxe, en ce qui concerne C++, c'est d'exprimer quelque chose.
Si on veut avoir des erreurs compile-time, il vaut mieux utiliser le
système de type.

| > | N'est -ce pas un peu choquant d'avoir une propriété dont
| > | la garantie d'existence n'est pas représentée dans l'interface
| > | de la classe - c'est une entorse à l'abstraction du type !?
| >
| > Non.
| >
| > Tout simplement, parce que tout ne se réduit pas à la syntaxe.
|
| Attends, entendons-nous bien : si tu nommes "lire" une fonction
| qui écrit, personne ne peut rien contre ça, nous sommes d'accord.

Ce qui ne fait que souligner que « sémantique » est la bonne porte.

| Mais il ne faut peut-être pas appeler sémantique tout ce qui échappe
| à la syntaxe (faute de quoi une syntaxe incomplète, donc fautive,
| serait toujours pardonnée).

c'est pourtant le cas. Du moins en ce qui concerne C++.

| AMHA la sémantique intervient quand une opération *représentée
| dans la syntaxe* échoue dans certaines conditions de contexte
| non modélisables par la syntaxe (exemple : lire sur une imprimante -
| la lecture est représentée syntaxiquement, mais la nature du périph
| ne l'est pas, dans ce cas).

ce qui est entre parenthèses est censé être une preuve par l'exemple ?
sinon, il ne suffit pas de l'affirmer, il faut donner des éléments de
preuve.

| Ici c'est différent :

qu'est-ce qui est différent ? Tout d'abord, comme je l'ai dit plus
haut, je ne suis pas d'accord avec ton affirmation en ce qui concerne
la sémantique.

| peux-tu me dire quelle fonction de l'interface
| public de std:vector est susceptible d'échouer si les éléments sont
| non contigus ?

comme je te l'ai dit plus haut, C++ ne se réduit pas à la syntaxe.
Si tu veux comprendre et utiliser C++, il faut sonner à la porte
« sémantique ». Et si tu sonnes à cette porte, la réponse à ta
question est évidente.

| Je n'en vois aucune (sous réserve que l'*implémentation*
| en tienne compte, évidemment).
| Par conséquent, si l'interface public fonctionne même en l'absence
| de contiguïté, alors c'est que c'est une propriété de l'implémentation,
| et non du type défini par son interface public. En l'occurrence, je ne
| dirais pas "sémantique" pour implémentation ;-) Mais bon, je suis sûr
| que ce n'est pas ta position non plus...

je ne te le fais pas dire.

[...]

| > | en premier lieu *l'implémentation* d'un itérateur sur cette
| > | classe, mais à partir du moment où l'utilisateur peut avoir
| > | accès au "prochain" élément, en quoi cela l'intéresse-t-il
| > | de savoir où il se trouve par rapport au précédent ?
| >
| > Parce que le monde ne tourne pas autour des itérateurs ?
| >
| > std::vector<char> v(100);
| > std::cin.read(&v[0], v.size());
| >
| > | Finalement j'arrive à formuler ma question sous sa forme la
| > | plus intéressante : en quoi cette contiguïté est-elle pertinente
| > | dans le contexte d'une classe munie d'un itérateur ? (dont
| > | l'usager, je me répète, n'a pas à savoir *comment* il itère).
| >
| > Voir ci-dessus par exemple. Mais je suis certain que si tu regardes
| > d'autres codes avec des interfaces "C", tu verras l'utilité.
|
|
| Ah mais voilà, "C", je suis d'accord - ce que j'appelais malpropre ;-)

chacun a sa définition de « malpropre », c'est pour cela que je t'ai
demandé

peux-tu expliquer cette utilisation de sizeof et en quoi ce serait
« malpropre » ?

mais tu t'es garder d'expliquer « cette utilisation de sizeof »
et « en quoi ce serait "malpropre" ». Tu te contentes juste de dire
que ce que tu appelerais malpropre.

| Là tu vas rendre fou le type qui a passé des heures à concevoir
| l'interface, puisque tu le court-circuite allègrement.

Je ne rends pas fou le type qui a conçu std::vector parce qu'il a dit
que pour lui, un std::vector stockait ses éléments de manière contigü
-- s'il n'y avait pas d'écrit sur le sujet, c'était un oubli.
Pour lui, les itérateurs c'est juste *un moyen* de séparer les
containers des algorithmes.

| C'est bien évident que
| > std::cin.read(&v[0], v.size());
| va échouer s'il n'y a pas contiguïté, mais cela n'est pas propre
| pour moi.

Ah.

| La façon propre serait de prévoir, dans l'interface public,
| une fonction de lecture de n éléments ;

C'ets fait. c'est juste que tu refuses de la voir et de l'admettre.

| après quoi, si l'implémenteur
| décide qu'il y a contiguïté, il peut implémenter cette fonction avec
| ta tournure, pour des raisons de simplicité et d'efficacité - mais je ne
| vois pas en quoi cela doit concerner l'appelant.
| Sans compter que, dans le cas que tu donnes en exemple, ça prouve
| que la librairie manque de hauteur de vue (AMHA) : il est manifeste
| qu'une classe template du genre chaine d'objets nous mettrait d'accord

qu'est-ce qu'une chaîne d'objets sinon une suite ?

| tous les deux, et d'une façon élégante (tu aurais évidemment une
| strstream qui ferait exactement le boulot ci-dessus) - et pourquoi est-elle
| manquante, cette classe ?!!

Parce qu'est est déjà là. C'est juste que tu focalises sur la syntaxe
au lieu de t'intéresser à la sémantique.

-- Gaby
« I am of the opinion that most people focus on syntax issues to the
detriment of type issues. The critical issues in the design of C++
were always those of type, ambiguity, and access control, not those
of syntax. » -- B. Stroustrup in "Design and Evolution of C++"
Avatar
Alain Naigeon
"Gabriel Dos Reis" a écrit dans le message
news:

"Alain Naigeon" writes:
|
| Une abstraction consiste à prendre de la hauteur par rapport
| à un niveau moins abstrait ; en l'occurrence, peux-tu expliquer
| quel est le concept moins abstrait que l'adresse qui est englobé
| par celle-ci ?

le métal ?


Ok, pourquoi pas...


| Pour ma part je te dirai que la notion de handle, rencontrée dans
| mes petites aventures, est une abstraction de l'adresse, non ?

C'est une autre *forme* d'adresse -- pas directement celle du langage
C++, mais elle est bien une forme d'adresse.


Le mot qui m'intéresse ici, c'est "autre" ; l'objet peut être déplacé
sans que l'utilisateur ait à s'en soucier, puisque le handle lui permet
de garder une référence valide.
C'est donc une abstraction *supplémentaire*. Tu peux appeler cela
une adresse si tu veux, ça ne me dérange pas, mais c'est une adresse
plus abstraite que la première, puisqu'elle reste valide dans des
circonstances plus larges.

[...]
Sauf que l'interface de std::vector prévoit aussi de prendre l'adresse
de ses éléments.


Alors tu peux ré-écrire tes exemples sans utiliser '&', je suppose ?!

La syntaxe, en ce qui concerne C++, c'est d'exprimer quelque chose.
Si on veut avoir des erreurs compile-time, il vaut mieux utiliser le
système de type.


Bon, j'utilisais type dans le sens de ce qu'une classe prévoit dans
son interface public ; et uneclasse.unefonctionmembre() c'est
bien de la syntaxe ? Et si cette fonction n'existe pas, c'est bien
une erreur de compil ? Mes questions ne se veulent pas provocantes,
c'est juste pour éclaircir un malentendu manifeste.


| > | N'est -ce pas un peu choquant d'avoir une propriété dont
| > | la garantie d'existence n'est pas représentée dans l'interface
| > | de la classe - c'est une entorse à l'abstraction du type !?
| >
| > Non.
| >
| > Tout simplement, parce que tout ne se réduit pas à la syntaxe.
|
| Attends, entendons-nous bien : si tu nommes "lire" une fonction
| qui écrit, personne ne peut rien contre ça, nous sommes d'accord.

Ce qui ne fait que souligner que « sémantique » est la bonne porte.

| Mais il ne faut peut-être pas appeler sémantique tout ce qui échappe
| à la syntaxe (faute de quoi une syntaxe incomplète, donc fautive,
| serait toujours pardonnée).

c'est pourtant le cas. Du moins en ce qui concerne C++.



Ce qui me gêne dans cette réponse c'est qu'elle suppose implicitement
que la sémantique est une "poubelle" = tout ce qui n'est pas syntaxe. Mais
alors cela rend vain toute tentative de savoir ce qu'est une bonne
syntaxe... à moins d'énoncer une tautologie = une syntaxe est bonne
si elle minimise la sémantique. Voilà une définition conceptuellement
très pauvre et très laxiste de la sémantique !

| peux-tu me dire quelle fonction de l'interface
| public de std:vector est susceptible d'échouer si les éléments sont
| non contigus ?

comme je te l'ai dit plus haut, C++ ne se réduit pas à la syntaxe.
Si tu veux comprendre et utiliser C++, il faut sonner à la porte
« sémantique ». Et si tu sonnes à cette porte, la réponse à ta
question est évidente.

| Je n'en vois aucune (sous réserve que l'*implémentation*
| en tienne compte, évidemment).
| et non du type défini par son interface public. En l'occurrence, je ne
| dirais pas "sémantique" pour implémentation ;-) Mais bon, je suis sûr
| que ce n'est pas ta position non plus...

je ne te le fais pas dire.


Les derniers mots étaient pour te signifier que je ne suis pas sûr de moi
ni arrogant dans les 4 lignes qui précèdent. Tu te précipites sur cette
clause de style de ma part, mais sans répondre aux 4 lignes qui étaient
mon argument - peut-être erronné, mais alors *en quoi* est-il erroné
d'affirmer que :
| Par conséquent, si l'interface public fonctionne même en l'absence
| de contiguïté, alors c'est que c'est une propriété de l'implémentation,



| La façon propre serait de prévoir, dans l'interface public,
| une fonction de lecture de n éléments ;

C'ets fait. c'est juste que tu refuses de la voir et de l'admettre.


Mais non, ne nous énervons pas, je ne refuse rien, il se peut tout
simplement que je sois mal informé ; néanmoins, outre que tu
aurais pu me mettre sur la piste, après ta réponse je m'explique
mal ton usage de cin.read et de & qui ne sont ni l'un ni l'autre
des fonctionnalités de std::vector

| après quoi, si l'implémenteur
| décide qu'il y a contiguïté, il peut implémenter cette fonction avec
| ta tournure, pour des raisons de simplicité et d'efficacité - mais je ne
| vois pas en quoi cela doit concerner l'appelant.
| Sans compter que, dans le cas que tu donnes en exemple, ça prouve
| que la librairie manque de hauteur de vue (AMHA) : il est manifeste
| qu'une classe template du genre chaine d'objets nous mettrait d'accord

qu'est-ce qu'une chaîne d'objets sinon une suite ?


Précisément, dans le cas d'une chaîne la contiguïté est évidente, et
elle est constitutive de la classe ; tu ne peux pas "vider" un caractère
sans diminuer la longeur de la chaîne, par exemple ; alors que pour
un vecteur tu peux mémoriser une place vide si tu prévois un objet
spécial pour cela. En dehors de cette différence (importante !) je ne
vois guère de distinction entre une chaîne et un std::vector<char>
mais là tu peux peut-être m'éclairer... c'est une vraie question, sincère.


| tous les deux, et d'une façon élégante (tu aurais évidemment une
| strstream qui ferait exactement le boulot ci-dessus) - et pourquoi
est-elle

| manquante, cette classe ?!!

Parce qu'est est déjà là.


hint, please ?

-- Gaby
« I am of the opinion that most people focus on syntax issues to the
detriment of type issues. The critical issues in the design of C++
were always those of type, ambiguity, and access control, not those
of syntax. » -- B. Stroustrup in "Design and Evolution of C++"


I'm of the opinion that a reference to a few famous people is possible
only because they are many other ones that are neither as brilliant
nor as famous... But, if you "kill" the latter ones, amongst whom will
you remain famous ? :-)

--

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:

| > | Pour ma part je te dirai que la notion de handle, rencontrée dans
| > | mes petites aventures, est une abstraction de l'adresse, non ?
| >
| > C'est une autre *forme* d'adresse -- pas directement celle du langage
| > C++, mais elle est bien une forme d'adresse.
|
| Le mot qui m'intéresse ici, c'est "autre" ; l'objet peut être déplacé
| sans que l'utilisateur ait à s'en soucier, puisque le handle lui permet
| de garder une référence valide.
| C'est donc une abstraction *supplémentaire*. Tu peux appeler cela
| une adresse si tu veux, ça ne me dérange pas, mais c'est une adresse
| plus abstraite que la première, puisqu'elle reste valide dans des
| circonstances plus larges.

cela en fait moins une forme d'adresse ?

| [...]
| > Sauf que l'interface de std::vector prévoit aussi de prendre l'adresse
| > de ses éléments.
|
| Alors tu peux ré-écrire tes exemples sans utiliser '&', je suppose ?!

comment prends-tu l'adresse d'un objet sans utiliser « & » ? 

| > La syntaxe, en ce qui concerne C++, c'est d'exprimer quelque chose.
| > Si on veut avoir des erreurs compile-time, il vaut mieux utiliser le
| > système de type.
|
| Bon, j'utilisais type dans le sens de ce qu'une classe prévoit dans
| son interface public ; et uneclasse.unefonctionmembre() c'est
| bien de la syntaxe ?

la syntaxe n'a intérêt que parce qu'il y a une sémantique derrière.

| Et si cette fonction n'existe pas, c'est bien
| une erreur de compil ?

si la recherche de nom ne trouve pas le nom unefonctionmembre alors
effectivement c'est une erreur compile-time. Si la recherche de noms
trouve un objet membre (et non une fonction) pour lequel le type
correspondant surcharge l'opérateur d'application fonctionnelle, alors
ce n'est pas une erreur.

Le medium n'est pas le message.

| Mes questions ne se veulent pas provocantes,
| c'est juste pour éclaircir un malentendu manifeste.

Je sais bien que tes questions ne sont pas provocantes.

Si std::vector<>::operator[] renvoie une reférence, c'est qu'on peut
prendre l'adresse de la chose sur laquelle la référence est renvoyée

| > | > | N'est -ce pas un peu choquant d'avoir une propriété dont
| > | > | la garantie d'existence n'est pas représentée dans l'interface
| > | > | de la classe - c'est une entorse à l'abstraction du type !?
| > | >
| > | > Non.
| > | >
| > | > Tout simplement, parce que tout ne se réduit pas à la syntaxe.
| > |
| > | Attends, entendons-nous bien : si tu nommes "lire" une fonction
| > | qui écrit, personne ne peut rien contre ça, nous sommes d'accord.
| >
| > Ce qui ne fait que souligner que « sémantique » est la bonne porte.
| >
| > | Mais il ne faut peut-être pas appeler sémantique tout ce qui échappe
| > | à la syntaxe (faute de quoi une syntaxe incomplète, donc fautive,
| > | serait toujours pardonnée).
| >
| > c'est pourtant le cas. Du moins en ce qui concerne C++.
|
|
| Ce qui me gêne dans cette réponse c'est qu'elle suppose implicitement
| que la sémantique est une "poubelle" = tout ce qui n'est pas syntaxe.

comme je l'ai souligné dans mon message, « sémantique » n'est pas
une « poubelle » comme tu l'entends. « sémantique » est la source d'où
tout découle. La syntaxe n'est qu'un subalterne qui essaye de porter
-- autant qu'elle peut le message, je veux dire la sémantique. Mais la
clé, le trésor, la clé du trésor c'est la sémantique. En C++, elle ne
délègue pas tout à la syntaxe.

| Mais alors cela rend vain toute tentative de savoir ce qu'est une bonne
| syntaxe... à moins d'énoncer une tautologie = une syntaxe est bonne
| si elle minimise la sémantique.

je crois que ce que cela montre c'est le flou de « bonne », et surtout
réduire les idées aux graffitis qui servent à en exprimer n'est pas
une manière efficace de les comprendre.

| Voilà une définition conceptuellement
| très pauvre et très laxiste de la sémantique !

je dirais plutôt, voilà une abstraction (de syntaxe) bien pauvre !

|
| > | peux-tu me dire quelle fonction de l'interface
| > | public de std:vector est susceptible d'échouer si les éléments sont
| > | non contigus ?
| >
| > comme je te l'ai dit plus haut, C++ ne se réduit pas à la syntaxe.
| > Si tu veux comprendre et utiliser C++, il faut sonner à la porte
| > « sémantique ». Et si tu sonnes à cette porte, la réponse à ta
| > question est évidente.
| >
| > | Je n'en vois aucune (sous réserve que l'*implémentation*
| > | en tienne compte, évidemment).
| > | et non du type défini par son interface public. En l'occurrence, je ne
| > | dirais pas "sémantique" pour implémentation ;-) Mais bon, je suis sûr
| > | que ce n'est pas ta position non plus...
| >
| > je ne te le fais pas dire.
|
| Les derniers mots étaient pour te signifier que je ne suis pas sûr de moi
| ni arrogant dans les 4 lignes qui précèdent. Tu te précipites sur cette
| clause de style de ma part, mais sans répondre aux 4 lignes qui étaient

hum, j'ai découpé ta phrase en morceaux que j'estimais techniques et
un autre purement théatrale (la dernière) à laquelle j'ai répondue
par la phrase ci-dessus. J'ai répondu avec autant d'empressement
(sinon encore plus) aux morceaux techniques comme tu peux le voir
encore dans le message auquel tu réponds.
Ne cédons pas à la facilité.

| mon argument - peut-être erronné, mais alors *en quoi* est-il erroné
| d'affirmer que :
| > | Par conséquent, si l'interface public fonctionne même en l'absence
| > | de contiguïté, alors c'est que c'est une propriété de l'implémentation,

puisque j'ai répondu aux prémises qui précédaient ce « par conséquent »
était-il nécessaire de se prononcer/répéter sur la conclusion ?

| > | La façon propre serait de prévoir, dans l'interface public,
| > | une fonction de lecture de n éléments ;
| >
| > C'ets fait. c'est juste que tu refuses de la voir et de l'admettre.
|
| Mais non, ne nous énervons pas,

je ne m'énerve pas. Ou alors tu parlais de toi ? ;-/

| je ne refuse rien, il se peut tout
| simplement que je sois mal informé ; néanmoins, outre que tu
| aurais pu me mettre sur la piste,

je l'ai fait à plusieurs reprises, tu es libre après de suivre la
piste ou non. On dit souvent qu'on ne peut pas forcer un âne qui n'a
pas soif à boire. Je peux juste te montrer la piste (et je l'ai fait)
c'est à toi de décider si tu veux la voir et l'emprunter.

| après ta réponse je m'explique
| mal ton usage de cin.read et de & qui ne sont ni l'un ni l'autre
| des fonctionnalités de std::vector

std::vector<>::operator[] renvoie une référence, donc on peut en prendre
l'adresse -- cela fait partie de l'interface comme tu dirais.

L'utilisation de std::cin.read, c'est pour te montrer d'autres
combinaisons utiles avec le reste de la bibliothèque.

| > | après quoi, si l'implémenteur
| > | décide qu'il y a contiguïté, il peut implémenter cette fonction avec
| > | ta tournure, pour des raisons de simplicité et d'efficacité - mais je ne
| > | vois pas en quoi cela doit concerner l'appelant.
| > | Sans compter que, dans le cas que tu donnes en exemple, ça prouve
| > | que la librairie manque de hauteur de vue (AMHA) : il est manifeste
| > | qu'une classe template du genre chaine d'objets nous mettrait d'accord
| >
| > qu'est-ce qu'une chaîne d'objets sinon une suite ?
|
| Précisément, dans le cas d'une chaîne la contiguïté est évidente,

Pourquoi est-ce plus évidente que dans le cas d'une suite ?

| et elle est constitutive de la classe ; tu ne peux pas "vider" un caractère

nous parlons toujours bien de ta « chaîne d'objets » ?

| sans diminuer la longeur de la chaîne, par exemple ; alors que pour
| un vecteur tu peux mémoriser une place vide si tu prévois un objet
| spécial pour cela.

??? Peux-tu expliquer ?

| En dehors de cette différence (importante !) je ne
| vois guère de distinction entre une chaîne et un std::vector<char>
| mais là tu peux peut-être m'éclairer... c'est une vraie question, sincère.

Quelle est exactement ta question ?

| > | tous les deux, et d'une façon élégante (tu aurais évidemment une
| > | strstream qui ferait exactement le boulot ci-dessus) - et pourquoi
| est-elle
| > | manquante, cette classe ?!!
| >
| > Parce qu'est est déjà là.
|
| hint, please ?

std::vector est une chaîne contigüe d'objets.

| > -- Gaby
| > « I am of the opinion that most people focus on syntax issues to the
| > detriment of type issues. The critical issues in the design of C++
| > were always those of type, ambiguity, and access control, not those
| > of syntax. » -- B. Stroustrup in "Design and Evolution of C++"
|
| I'm of the opinion that a reference to a few famous people is possible
| only because they are many other ones that are neither as brilliant
| nor as famous... But, if you "kill" the latter ones, amongst whom will
| you remain famous ? :-)

probablement à la Santé ou Guantanamo, ça dépend.

-- Gaby
« I am of the opinion that most people focus on syntax issues to the
detriment of type issues. The critical issues in the design of C++
were always those of type, ambiguity, and access control, not those
of syntax. » -- B. Stroustrup in "Design and Evolution of C++"
Avatar
Alain Naigeon
"Gabriel Dos Reis" a écrit dans le message
news:

"Alain Naigeon" writes:

| > | Pour ma part je te dirai que la notion de handle, rencontrée dans
| > | mes petites aventures, est une abstraction de l'adresse, non ?
| >
| > C'est une autre *forme* d'adresse -- pas directement celle du langage
| > C++, mais elle est bien une forme d'adresse.
|
| Le mot qui m'intéresse ici, c'est "autre" ; l'objet peut être déplacé
| sans que l'utilisateur ait à s'en soucier, puisque le handle lui permet
| de garder une référence valide.
| C'est donc une abstraction *supplémentaire*. Tu peux appeler cela
| une adresse si tu veux, ça ne me dérange pas, mais c'est une adresse
| plus abstraite que la première, puisqu'elle reste valide dans des
| circonstances plus larges.

cela en fait moins une forme d'adresse ?


Hum, pour cette fois c'est toi qui lis un peu vite, car je viens d'écrire :
| Tu peux appeler cela
| une adresse si tu veux, ça ne me dérange pas,


Cependant je crois avoir montré que dans cet ensemble d'adresses
(au sens large où tu l'entends) il existe une relation d'ordre basée sur
le niveau d'abstraction. Ce qui m'autorise à établir une distinction
entre ces différentes sortes d'adresses. Ceci dit, tu peux penser que
j'accorde trop d'importance à cette distinction, ou me prouver
qu'elle n'est pas pertinente ici...


| [...]
| > Sauf que l'interface de std::vector prévoit aussi de prendre l'adresse
| > de ses éléments.
|
| Alors tu peux ré-écrire tes exemples sans utiliser '&', je suppose ?!

comment prends-tu l'adresse d'un objet sans utiliser « & » ?


Evidemment je ne peux me passer de &, mais je plaide pour utiliser,
quand c'est possible, ce genre d'outil le moins possible dans une
interface publique ; par exemple :

objet * monVecteur::addressOf (int i) { return &v[i] ; }


[...]
Si std::vector<>::operator[] renvoie une reférence, c'est qu'on peut
prendre l'adresse de la chose sur laquelle la référence est renvoyée


Ok, ça c'est une réponse, y compris à ce que j'écrivais juste à l'instant
:-)

comme je l'ai souligné dans mon message, « sémantique » n'est pas
une « poubelle » comme tu l'entends. « sémantique » est la source d'où
tout découle. La syntaxe n'est qu'un subalterne qui essaye de porter
-- autant qu'elle peut le message, je veux dire la sémantique. Mais la
clé, le trésor, la clé du trésor c'est la sémantique. En C++, elle ne
délègue pas tout à la syntaxe.


Pas tout, bien sûr. Mais tu vois comme tu peux être soudain très clair
quand on te pousse un peu :-)


| Mais alors cela rend vain toute tentative de savoir ce qu'est une bonne
| syntaxe... à moins d'énoncer une tautologie = une syntaxe est bonne
| si elle minimise la sémantique.

je crois que ce que cela montre c'est le flou de « bonne »,


accordé, je me suis un peu mélangé les pinceaux.

et surtout
réduire les idées aux graffitis qui servent à en exprimer n'est pas
une manière efficace de les comprendre.


Toutefois, il n'y a pas de message sans medium ou, pour être plus
précis, même une spécification rigoureuse de sémantique est obligée
de s'exprimer en "graffitis". Et la syntaxe que tu sembles dévaloriser (*)
est
une façon de donner aussi de la rigueur à ces graffitis, au grand
bénéfice de la sémantique qu'ils spécifient. Est-ce que tu es capable
de spécifier une sémantique à l'aide d'un système de signes dépourvu
de spécification ?
(*) "graffiti" n'étant pas exactement un terme valorisant.


| mon argument - peut-être erronné, mais alors *en quoi* est-il erroné
| d'affirmer que :
| > | Par conséquent, si l'interface public fonctionne même en l'absence
| > | de contiguïté, alors c'est que c'est une propriété de
l'implémentation,


puisque j'ai répondu aux prémises qui précédaient ce « par conséquent »
était-il nécessaire de se prononcer/répéter sur la conclusion ?


Je n'ai pas compris où se trouve la réponse à ces prémisses.


| > | La façon propre serait de prévoir, dans l'interface public,
| > | une fonction de lecture de n éléments ;
| >
| > C'ets fait. c'est juste que tu refuses de la voir et de l'admettre.
|
| Mais non, ne nous énervons pas,

je ne m'énerve pas. Ou alors tu parlais de toi ? ;-/


Ben non, mais "refuser de comprendre" c'est presque une affirmation
de mauvaise foi ;-) Comme je sais, moi, que je ne suis pas de mauvaise
foi, il me reste à découvrir la seule alternative que tu me laisses un peu
plus loin...



std::vector<>::operator[] renvoie une référence, donc on peut en prendre
l'adresse -- cela fait partie de l'interface comme tu dirais.

L'utilisation de std::cin.read, c'est pour te montrer d'autres
combinaisons utiles avec le reste de la bibliothèque.


Ok, là j'ai compris.


| > | après quoi, si l'implémenteur
| > | décide qu'il y a contiguïté, il peut implémenter cette fonction avec
| > | ta tournure, pour des raisons de simplicité et d'efficacité - mais
je ne

| > | vois pas en quoi cela doit concerner l'appelant.
| > | Sans compter que, dans le cas que tu donnes en exemple, ça prouve
| > | que la librairie manque de hauteur de vue (AMHA) : il est manifeste
| > | qu'une classe template du genre chaine d'objets nous mettrait
d'accord

| >
| > qu'est-ce qu'une chaîne d'objets sinon une suite ?
|
| Précisément, dans le cas d'une chaîne la contiguïté est évidente,

Pourquoi est-ce plus évidente que dans le cas d'une suite ?

| et elle est constitutive de la classe ; tu ne peux pas "vider" un
caractère


nous parlons toujours bien de ta « chaîne d'objets » ?

| sans diminuer la longeur de la chaîne, par exemple ; alors que pour
| un vecteur tu peux mémoriser une place vide si tu prévois un objet
| spécial pour cela.

??? Peux-tu expliquer ?


Je m'explique mal ta question : j'ai vu plusieurs librairies où l'objet
rangé à la place i peut être un objet spécial de son type, appelé
ObjetRien ou quelque chose de ce genre. C'est à dire que la place
vide, à l'index i, est mémorisée. Dans les classes de chaînes que j'ai
rencontrées, en revanche, une telle chose n'est en général pas prévue,
ou alors cela m'échappé (mais pas toujours, car dans quelques cas je
suis sûr de moi).



| En dehors de cette différence (importante !) je ne
| vois guère de distinction entre une chaîne et un std::vector<char>
| mais là tu peux peut-être m'éclairer... c'est une vraie question,
sincère.


Quelle est exactement ta question ?


Elle est marginale, peut-être révélatrice d'une ignorance crasse, mais
elle est claire : fais-tu une différence entre un vecteur et une chaîne ?
Je ne parle pas d'implémentation, mais de ce qui est fourni par leur
interface public, ou, si tu préfères, de l'idée que tu te fais de ces deux
types abstraits.



std::vector est une chaîne contigüe d'objets.


Serait-ce là une réponse précise à une question pas claire ? ;-)
[tu n'as à aucun moment affirmé explicitement que ma question
n'était pas claire, je te l'accorde par avance, connaissant ta
façon de répondre - mais je n'imagine pas que tu aurais demandé
de préciser une question que tu percevais comme claire]


| > -- Gaby
| > « I am of the opinion that most people focus on syntax issues to the
| > detriment of type issues. The critical issues in the design of C++
| > were always those of type, ambiguity, and access control, not those
| > of syntax. » -- B. Stroustrup in "Design and Evolution of C++"
|
| I'm of the opinion that a reference to a few famous people is possible
| only because they are many other ones that are neither as brilliant
| nor as famous... But, if you "kill" the latter ones, amongst whom will
| you remain famous ? :-)

probablement à la Santé ou Guantanamo, ça dépend.


Entre temps j'ai laissé échapper la deuxième alternative que tu me
laissais, en dehors de la mauvaise foi ; c'était l'âne de Buridan...
Mais je vois maintenant que tu es au moins aussi dur avec toi-même
qu'avec les autres ;-)

--

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:

[...]

| > cela en fait moins une forme d'adresse ?
|
| Hum, pour cette fois c'est toi qui lis un peu vite, car je viens d'écrire :
| > | Tu peux appeler cela
| > | une adresse si tu veux, ça ne me dérange pas,
|
| Cependant je crois avoir montré que dans cet ensemble d'adresses
| (au sens large où tu l'entends) il existe une relation d'ordre basée sur
| le niveau d'abstraction.

Tout à fait.

| Ce qui m'autorise à établir une distinction
| entre ces différentes sortes d'adresses. Ceci dit, tu peux penser que
| j'accorde trop d'importance à cette distinction, ou me prouver
| qu'elle n'est pas pertinente ici...

disons que je n'ai pas trouvé suffisamment d'éléments pour dire que
la distinction est pertinente.

| > | [...]
| > | > Sauf que l'interface de std::vector prévoit aussi de prendre l'adresse
| > | > de ses éléments.
| > |
| > | Alors tu peux ré-écrire tes exemples sans utiliser '&', je suppose ?!
| >
| > comment prends-tu l'adresse d'un objet sans utiliser « & » ?
|
| Evidemment je ne peux me passer de &, mais je plaide pour utiliser,
| quand c'est possible, ce genre d'outil le moins possible dans une
| interface publique ; par exemple :
|
| objet * monVecteur::addressOf (int i) { return &v[i] ; }

qu'est-ce que cela apporte ?

| [...]
| > Si std::vector<>::operator[] renvoie une reférence, c'est qu'on peut
| > prendre l'adresse de la chose sur laquelle la référence est renvoyée
|
| Ok, ça c'est une réponse, y compris à ce que j'écrivais juste à l'instant
| :-)
|
| > comme je l'ai souligné dans mon message, « sémantique » n'est pas
| > une « poubelle » comme tu l'entends. « sémantique » est la source d'où
| > tout découle. La syntaxe n'est qu'un subalterne qui essaye de porter
| > -- autant qu'elle peut le message, je veux dire la sémantique. Mais la
| > clé, le trésor, la clé du trésor c'est la sémantique. En C++, elle ne
| > délègue pas tout à la syntaxe.
|
| Pas tout, bien sûr. Mais tu vois comme tu peux être soudain très clair
| quand on te pousse un peu :-)
|
|
| > | Mais alors cela rend vain toute tentative de savoir ce qu'est une bonne
| > | syntaxe... à moins d'énoncer une tautologie = une syntaxe est bonne
| > | si elle minimise la sémantique.
| >
| > je crois que ce que cela montre c'est le flou de « bonne »,
|
| accordé, je me suis un peu mélangé les pinceaux.
|
| et surtout
| > réduire les idées aux graffitis qui servent à en exprimer n'est pas
| > une manière efficace de les comprendre.
|
| Toutefois, il n'y a pas de message sans medium ou, pour être plus
| précis, même une spécification rigoureuse de sémantique est obligée
| de s'exprimer en "graffitis".

Bien sûr, mais une question importante est : est-ce les graffitis
transportent fidèlement le message ?

| Et la syntaxe que tu sembles dévaloriser (*)

Je ne la dévalorise pas, je la positionne simplement à sa place : elle
n'est qu'un medium ; et ce n'est pas le message.

| est
| une façon de donner aussi de la rigueur à ces graffitis, au grand
| bénéfice de la sémantique qu'ils spécifient. Est-ce que tu es capable
| de spécifier une sémantique à l'aide d'un système de signes dépourvu
| de spécification ?

cela n'a pas de sens, n'est-ce pas ? À partir du moment où tu parles
de spécification, tu parles de sémantiques.

| (*) "graffiti" n'étant pas exactement un terme valorisant.

Probablement pas, selon les personnes. Ici, je l'ai utilisé
volontairement pour mettre en valeur son caractère de médium, à
distinguer du message.

| > | mon argument - peut-être erronné, mais alors *en quoi* est-il erroné
| > | d'affirmer que :
| > | > | Par conséquent, si l'interface public fonctionne même en l'absence
| > | > | de contiguïté, alors c'est que c'est une propriété de
| l'implémentation,
| >
| > puisque j'ai répondu aux prémises qui précédaient ce « par conséquent »
| > était-il nécessaire de se prononcer/répéter sur la conclusion ?
|
| Je n'ai pas compris où se trouve la réponse à ces prémisses.

Je viens juste d'extraire ceci de ma réponse que je t'ai faite

| Ici c'est différent :

qu'est-ce qui est différent ? Tout d'abord, comme je l'ai dit plus
haut, je ne suis pas d'accord avec ton affirmation en ce qui concerne
la sémantique.

| peux-tu me dire quelle fonction de l'interface
| public de std:vector est susceptible d'échouer si les éléments sont
| non contigus ?

comme je te l'ai dit plus haut, C++ ne se réduit pas à la syntaxe.
Si tu veux comprendre et utiliser C++, il faut sonner à la porte
« sémantique ». Et si tu sonnes à cette porte, la réponse à ta
question est évidente.

[...]

| > | sans diminuer la longeur de la chaîne, par exemple ; alors que pour
| > | un vecteur tu peux mémoriser une place vide si tu prévois un objet
| > | spécial pour cela.
| >
| > ??? Peux-tu expliquer ?
|
| Je m'explique mal ta question : j'ai vu plusieurs librairies où l'objet
| rangé à la place i peut être un objet spécial de son type, appelé
| ObjetRien ou quelque chose de ce genre. C'est à dire que la place
| vide, à l'index i, est mémorisée. Dans les classes de chaînes que j'ai
| rencontrées, en revanche, une telle chose n'est en général pas prévue,

la classe std::basic_string<> (dont une instantiation particulière est
std::string) requiert le caractère NUL.

| ou alors cela m'échappé (mais pas toujours, car dans quelques cas je
| suis sûr de moi).
|
|
| >
| > | En dehors de cette différence (importante !) je ne
| > | vois guère de distinction entre une chaîne et un std::vector<char>
| > | mais là tu peux peut-être m'éclairer... c'est une vraie question,
| sincère.
| >
| > Quelle est exactement ta question ?
|
| Elle est marginale, peut-être révélatrice d'une ignorance crasse, mais
| elle est claire : fais-tu une différence entre un vecteur et une chaîne ?

Pour moi, un vecteur est une chaîne -- mais une chaîne n'est pas
forcément un vecteur. Une chaîne == une suite.

| Je ne parle pas d'implémentation, mais de ce qui est fourni par leur
| interface public, ou, si tu préfères, de l'idée que tu te fais de ces deux
| types abstraits.
|
|
| >
| > std::vector est une chaîne contigüe d'objets.
|
| Serait-ce là une réponse précise à une question pas claire ? ;-)

C'est possible ;-D

| [tu n'as à aucun moment affirmé explicitement que ma question
| n'était pas claire, je te l'accorde par avance, connaissant ta
| façon de répondre - mais je n'imagine pas que tu aurais demandé
| de préciser une question que tu percevais comme claire]
|
| >
| > | > -- Gaby
| > | > « I am of the opinion that most people focus on syntax issues to the
| > | > detriment of type issues. The critical issues in the design of C++
| > | > were always those of type, ambiguity, and access control, not those
| > | > of syntax. » -- B. Stroustrup in "Design and Evolution of C++"
| > |
| > | I'm of the opinion that a reference to a few famous people is possible
| > | only because they are many other ones that are neither as brilliant
| > | nor as famous... But, if you "kill" the latter ones, amongst whom will
| > | you remain famous ? :-)
| >
| > probablement à la Santé ou Guantanamo, ça dépend.
|
| Entre temps j'ai laissé échapper la deuxième alternative que tu me
| laissais, en dehors de la mauvaise foi ; c'était l'âne de Buridan...
| Mais je vois maintenant que tu es au moins aussi dur avec toi-même
| qu'avec les autres ;-)

pourquoi devrais-je faire exception ?

-- Gaby