OVH Cloud OVH Cloud

Position de const

60 réponses
Avatar
Jmr
Bonjour, je voudrais écrire une fonction copiant le contenu d'un tableau
dans un autre. j'utilise la déclaration suivante :

bool Cpy(const float * & Source, float * & Dest)

En espérant que :
? & Source : passe le pointeur Source à la fonction en tant que référence
pour éviter une copie inutile (mais est-ce bien nécessaire ?)
? const float : évite de modifier la valeur du pointeur Source. (const
doit-il être placé là ou plutôt ici : float * const & Source ?)

Par la suite j'utilise une fonction déclarée ainsi :

bool Affect (const Data & src, Data & dest)

où :

Data est du genre :
struct Data
{
int n ;
float *p ;
} ;

Lorsque j'écris :
bool Affect (const Data & src, Data & dest)
{
Cpy(src.p, dest.p) ;
..
}

le compilateur affiche l'erreur suivante : error C2664: 'Cpy' : cannot
convert parameter 1 from 'float *const ' to 'const float *& '

j'en déduis que les qualificatifs const sont mal placés mais où faut'il les
placer ?

Par avance Merci

10 réponses

2 3 4 5 6
Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans news:,
| > Il ne faut pas oublier non plus que pour peu qu'on sait tapper (ce
| > que doit savoir tout programmeur), on tappe des lettres jusqu'à dix
|
| C'est quoi ta définition exacte de « savoir taper » ?

faire comme James fait ;-)

[...]

| Ceci dit, mon avis est que l'indentation devrait suffire à
| délimiter les blocs d'instructions

c'est pythonesque ;-)

-- Gaby
Avatar
Michel Michaud
Dans news:, Gabriel Dos
"Michel Michaud" writes:
Ceci dit, mon avis est que l'indentation devrait suffire à
délimiter les blocs d'instructions


c'est pythonesque ;-)


Il parait oui. Mais j'avais déjà poussé un collègue à utiliser
cette technique dans le langage de programmation qu'il inventait
(et pour lequel j'ai écrit un IDE).

Quelqu'un a-t-il une expérience négative avec Python à cause
de ce principe ? Sérieusement, je vois bien un éditeur ou un
préprocesseur ajouter les {} à un programme C++ écrit sans...

--
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:
| >> Ceci dit, mon avis est que l'indentation devrait suffire à
| >> délimiter les blocs d'instructions
| >
| > c'est pythonesque ;-)
|
| Il parait oui. Mais j'avais déjà poussé un collègue à utiliser
| cette technique dans le langage de programmation qu'il inventait
| (et pour lequel j'ai écrit un IDE).

je l'ai utilisée ans les cours d'algorithmique que j'avais donnés il y
a quelque temps. Mon sentiment est que le résulat n'est pas concluant
(tant qu'il n'y pas un vérificateur pour dire erreur de syntaxe) mais
pas complètement dénué d'intérêt non plus.

| Quelqu'un a-t-il une expérience négative avec Python à cause
| de ce principe ?

a titre personnel, je trouve que c'est trop rustique.

| Sérieusement, je vois bien un éditeur ou un
| préprocesseur ajouter les {} à un programme C++ écrit sans...

Bonne chance.

-- Gaby
Avatar
kanze
Gabriel Dos Reis wrote in message
news:...
writes:

[...]

| Rien ici ni sur unsigned, ni sur un nom de type défini par
| l'utilisateur. Tous les deux tombent dans la catégorie «
| type-specifier », et en particulier « simple-type-specifier ».
| Décrit en §7.1.5.2, où il est bien précisé, sans ambigüité, que la
| combinaison « unsigned typedef-name » est illégal.

où vois-tu cette précision ? Le passage que tu as cité dans ton
précédent message ne le dit pas.


Il le disait assez clairement, je crois. Si tu n'es pas convaincu, tu
n'as qu'à démander sur comp.std.c++. La combinaison « unsigned
typedef-name » n'était pas permis en C, et il n'a jamais été question de
le permettre en C++. Ou est-ce que tu as des indications autrement ?
Peut-être une implémentation de compilateur qui l'a interprété comme toi ?
(Les auteurs de g++, Sun CC et VC++ sembent être d'accord avec moi.)

| Mais je remarque avec ta mauvaise fois habituelle,

c'est l'hôpital qui se fout de la charité.

| tu as négligé à citer
| tes commentaires sur la légalité de :

| typedef int I ;
| unsigned I i ;

Non, je ne l'ai pas negligé puisque le passage auquel tu répondais ci
haut le couvre. Mais, c'est vrai que pour toi il faut tout repeter.


Et tu prétends réelement que ce bout de code est légal ? Or qu'il était
interdit en Kernighan et Richie, qu'il est interdit par la norme C et
par la norme C++, qu'il n'a jamais été question de le rendre légal en
C++, et qu'aucun compilateur ne l'accepte ?

--
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 as négligé à citer
| > | tes commentaires sur la légalité de :
|
| > | typedef int I ;
| > | unsigned I i ;
|
| > Non, je ne l'ai pas negligé puisque le passage auquel tu répondais ci
| > haut le couvre. Mais, c'est vrai que pour toi il faut tout repeter.
|
| Et tu prétends réelement que ce bout de code est légal ? Or qu'il était
| interdit en Kernighan et Richie, qu'il est interdit par la norme C et

K&R et la norme C ne définissent pas le C++.

| par la norme C++,

tu as cité la norme C++ sur les simple-types-specifier et tu prétends
qu'elle interdit les combinaisons unsigned typedef-name alors qu'ici
il est question de savoir qu'est la combinaison que peut trouver dans un
type-specifier, non pas juste dans un simple-type-specifier.

| qu'il n'a jamais été question de le rendre légal en
| C++, et qu'aucun compilateur ne l'accepte ?

le fait que les compilateurs dont tu disposes acceptent ou n'acceptent
pas le code, n'indique pas grand chose si le code est valide ou
non. C'est le B A BA, n'est-il pas ?

-- Gaby
Avatar
kanze
Jean-Marc Bourguet wrote in message
news:...
writes:

Mais ça se discute si on adopte une syntaxe Algol 68 (Modula-3, et
je crois Ada). Le problème avec cette syntaxe, c'est qu'il n'y pas
toujours une ouverture explicite -- c'est le then de l'if ou le do
de while ou de for qui ouvre un bloc.


Si j'ai bonne memoire Algol 68 a besoin d'une ouverture explicite (et
on peut utiliser { et } toujours si ma memoire est bonne meme si
.begin et .end etaient plus courant dans l'usage que j'ai vu -- Algol
68 est un langage amusant qui definit un langage de base et la
possibilite pour chaque implementation d'avoir son langage de
representation, le choix { ou .begin ou ( fait partie du langage de
representation). Ada et Modula 3 (Modula 2, oberon aussi si j'ai bonne
memoire, en fait tout les representants recents) ont une ouverture
implicite.


L'ouverture est implicite en Modula 2 et ses descendants. Quant aux
autres, j'avoue ne jamais m'en être servi -- c'est donc du ouï-dire, et
à prendre avec précaution.

Apparamment, aussi, il y aurait des avantages à utiliser des end
différents selon le type de bloc, du genre :

if ( condition ) then statements endif ;
while ( condition ) do statements enddo ;

etc.

Mais je n'ai pas un fort avis sur la question.


Ada utilise "end if" "end loop", l'avantage est un avantage de
diagnostic en cas d'erreur et de documentation (j'ai vu des gens
commenter toute } avec la structure qu'elle ferme).


Il me semble avoir lu une étude quelque part que les débuttants
faisaient moins d'erreurs avec les fermatures typées. J'avoue être
sceptique sur la différence que ça pourrait faire si les fonctions sont
convenablement petites.

Évidemment, si tu codes des fonctions de 400 lignes, avec 10 niveaux
d'imbrication, j'imagine qu'une indication de ce qu'on ferme pour être
util:-).

le = pour l'affectation,


Intuitivement, je verrais = pour la comparaison, et donc quelque
chose d'autre (:=, <-, etc.) pour l'affectation. Mais là non plus,
je n'ai pas d'avis très fort. L'importance, pour que l'affectation
multiple fonction, c'est que l'affectation ne soit pas un opérateur
comme les autres. Ce qui est un grand écart par rapport à la famille
C.

le type avant la variable,


Mais c'est là précisement la source du problème.


Perso dans mes fantasmes de definition d'un nouveau langage, c'est

identifieur : definition

pour tout (variable, type, fonction, block...) -- comme en Eiffel mais
peut-etre encore plus pousse au rang de principe de conception.


Est-ce que tu permettras les declarations dans la fonction ? Si oui,
comment distinguer entre une declaration et une affectation ou une
expression (sans avoir tout parsé, évidemment).

J'avoue que j'allais plus loin. Les valeurs de rétour d'une
fonction, c'était des variables prédéfinies dans la fonction. Il n'y
avait pas de return (ni de break, ni de goto, ni de continue).


Je connais quelques methodes
return
nom de la fonction (comme en Pascal, pose un probleme avec la
recursivite)
mot cle reserve/variable predefinie (comme en Eiffel)
variable de retour explicitement definie (comme la defunte
extention de g++)


C'est à peu près le dernier qui m'a servi.

Si tu veux des retours multiples, je crois que pouvoir les nommer est
un avantage. (De meme pour le this, Ada, Oberon permettent de le
nommer explicitement; peu d'avatange quand on a un dispatching simple
comme en C++ -- et dans ces langages d'ailleurs, sauf que ca donne le
choix sur le type de this pointeur, reference ou valeur ce qui peut
aider les optimisations quand l'objet tient dans un registre -- mais
uniformise la syntaxe -- pour Ada, pas pour Oberon -- et ouvre la voie
au dispatch multiple).

De même pour les tableaux :

double[] da;


Tu n'aurais pas fait du Java ?


En fait, non. Je me disais bien que cette syntaxe me rappelait quelque
chose.

Pourquoi pas :
variable da : array [] of double ;


Plus de trente lettres contre une douzaine...


Plus facile à lire. Alors, tu écris un programme une fois, mais il
sera lu une multitude de fois. Il faut donc priviléger la lecture.


Sur le sujet, vous faite des tableaux multiples, des tableaux de
tableaux ou les deux?


J'en étais pas arrivé aussi loin, mais je crois que j'aurais adopté la
solution de Modula : formellement, on a des « array[N] of array[M]... »,
mais le langage accepte la raccourcie : « array[N][M] of ... ».

--
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
Loïc Joly
wrote:


Il me semble avoir lu une étude quelque part que les débuttants
faisaient moins d'erreurs avec les fermatures typées. J'avoue être
sceptique sur la différence que ça pourrait faire si les fonctions sont
convenablement petites.

Évidemment, si tu codes des fonctions de 400 lignes, avec 10 niveaux
d'imbrication, j'imagine qu'une indication de ce qu'on ferme pour être
util:-).


C'est pour ça qu'en C++, j'ai tendance à commenter mes #endif (et depuis
peu, j'ai tendance à ne plus en utiliser que comme include guards).
D'autant plus que dans ce cas, l'indentation n'aide pas toujours.


--
Loïc

Avatar
Jean-Marc Bourguet
writes:

Perso dans mes fantasmes de definition d'un nouveau langage, c'est

identifieur : definition

pour tout (variable, type, fonction, block...) -- comme en Eiffel mais
peut-etre encore plus pousse au rang de principe de conception.


Est-ce que tu permettras les declarations dans la fonction ? Si oui,
comment distinguer entre une declaration et une affectation ou une
expression (sans avoir tout parsé, évidemment).


J'ai peut etre pas ete clair

pour une definition:

id : def ;

pour une affectation:

id := exp ;

(:= ou =, c'est de toute maniere non ambigu);

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
kanze
"Michel Michaud" wrote in message
news:<bNhcb.6135$...
Dans news:,
Il ne faut pas oublier non plus que pour peu qu'on sait tapper (ce
que doit savoir tout programmeur), on tappe des lettres jusqu'à dix


C'est quoi ta définition exacte de « savoir taper » ?


La même chose que ça veut dire pour une secrétaire. Il existe des cours
de dactylographie pour ceux qui veulent.

En fin de compte, un professionnel, quelque soit le domaine, sait se
servir de ses outils. Et le clavier, c'est bien un outil important pour
la plupart des programmeurs.

fois plus vite que les caractères spéciaux. Je sais qu'il me faut
moins de temps à tapper « begin » que de tapper un « { ». Et je


Pas moi. AltCar+` me donne un }, c'est seulement deux touches.


Et où se trouve ce AltCar ? Est-ce que tu peux l'utiliser regulièrement
sans risques des problèmes du tunnel carpien ? Sur mon clavier Sun (US),
le } se trouve déjà bien loin de la position de base, et exige une
extension du petit doigt qui ne doit pas faire du bien à la longue.

Ça me prend donc à peu près le même temps que taper un Q, un ( ou un
è.

parle encore d'un clavier US -- avec un clavier français, c'est
pire. (Or que tu veux bien des accents dans les commentaires,
n'est-ce pas.)


Mauvais clavier, changer de clavier :-)


Il faudrait vraiment que j'essaie un clavier Dvojac un de ces jours.

Ceci dit, mon avis est que l'indentation devrait suffire à délimiter
les blocs d'instructions (inversement, un éditeur intelligent en C++,
devrait mettre les {} automatiquement).


C'est une idée. Un macro d'éditeur qui crée les blocs. Mais alors,
qu'ils commencent par {, begin, ou this_is_the_start_of_a_bloc,
qu'importe.

--
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
Michel Michaud
Dans news:,
"Michel Michaud" wrote in message
news:<bNhcb.6135$...
Dans news:,
Il ne faut pas oublier non plus que pour peu qu'on sait tapper (ce
que doit savoir tout programmeur), on tappe des lettres jusqu'à
dix


C'est quoi ta définition exacte de « savoir taper » ?


La même chose que ça veut dire pour une secrétaire. Il existe des
cours de dactylographie pour ceux qui veulent.

En fin de compte, un professionnel, quelque soit le domaine, sait se
servir de ses outils. Et le clavier, c'est bien un outil important
pour la plupart des programmeurs.


Moi, j'écris rarement plus d'une vraie ligne de code sans avoir à
réfléchir par la suite suffisamment longtemps pour enlever mes doigts
du clavier...

fois plus vite que les caractères spéciaux. Je sais qu'il me faut
moins de temps à tapper « begin » que de tapper un « { ». Et je


Pas moi. AltCar+` me donne un }, c'est seulement deux touches.


Et où se trouve ce AltCar ? Est-ce que tu peux l'utiliser


Juste pour toi : http://www.gdzid.com/clavier.html

regulièrement sans risques des problèmes du tunnel carpien ? Sur
mon clavier Sun (US), le } se trouve déjà bien loin de la position
de base, et exige une extension du petit doigt qui ne doit pas
faire du bien à la longue.


Je ne suis pas un spécialiste, mais je sais que j'ai un problème
de tunnel carpien... quand l'été arrive et que je fais des travaux
dehors avec une pelle, un boyau d'arrosage, etc. Avec le clavier,
jamais de problème :-)

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



2 3 4 5 6