Olivier Azeau wrote:wrote:Olivier Azeau wrote:
[SNIP]
Si la bibliothèque standard couvrait tout ce qu'on peut faire
avec des pointeurs, et qu'on n'avait pas réelement besoin des
pointeurs
dans la programmation applicative, je dirais qu'on pourrait se passer
d'enseigner des pointeurs. Ce n'est pas le cas pour les pointeurs, mais
c'est peut-être le cas pour certaines autres techniques avancées.
Olivier Azeau wrote:
kanze@gabi-soft.fr wrote:
Olivier Azeau wrote:
[SNIP]
Si la bibliothèque standard couvrait tout ce qu'on peut faire
avec des pointeurs, et qu'on n'avait pas réelement besoin des
pointeurs
dans la programmation applicative, je dirais qu'on pourrait se passer
d'enseigner des pointeurs. Ce n'est pas le cas pour les pointeurs, mais
c'est peut-être le cas pour certaines autres techniques avancées.
Olivier Azeau wrote:wrote:Olivier Azeau wrote:
[SNIP]
Si la bibliothèque standard couvrait tout ce qu'on peut faire
avec des pointeurs, et qu'on n'avait pas réelement besoin des
pointeurs
dans la programmation applicative, je dirais qu'on pourrait se passer
d'enseigner des pointeurs. Ce n'est pas le cas pour les pointeurs, mais
c'est peut-être le cas pour certaines autres techniques avancées.
Je vois pour ma part des personnes qui connaissent des langages
évolués, dont le C++, et qui savent faire des bons trucs mais,
quand
on gratte la surface pour aller sur un comportement plus bas niveau,
il n'y a plus personne.
Je ne critique pas telle ou telle approche éducative : je dis juste
que, pour *mon contexte*, les pointeurs *c'est la base* et que celui
qui ne maîtrise pas ça, il ne maîtrise rien.
C'est pour cela que j'ai, légitimement je pense, un peu "peur" quand
on veut faire passer le C++ pour un langage de haut-niveau : dans
beaucoup de contextes, même si on essaie de faire évoluer les
choses,
cela n'est pas la réalité quotidienne.
J'ai l'impression qu'avec une telle approche on va rapidement en
arriver (si ce n'est déjà fait) à commencer par enseigner Loki
pour
découvrir des patterns fabrique ou visiteur sous prétexte que c'est
plus haut niveau et que l'on pourra voir les détails ensuite... Et
là
il y aura des "vieux réacs" pour avoir l'impression que l'on apprend
à
qqun à conduire une voiture en le mettant aux commandes d'une
Formule
1.
Je vois pour ma part des personnes qui connaissent des langages
évolués, dont le C++, et qui savent faire des bons trucs mais,
quand
on gratte la surface pour aller sur un comportement plus bas niveau,
il n'y a plus personne.
Je ne critique pas telle ou telle approche éducative : je dis juste
que, pour *mon contexte*, les pointeurs *c'est la base* et que celui
qui ne maîtrise pas ça, il ne maîtrise rien.
C'est pour cela que j'ai, légitimement je pense, un peu "peur" quand
on veut faire passer le C++ pour un langage de haut-niveau : dans
beaucoup de contextes, même si on essaie de faire évoluer les
choses,
cela n'est pas la réalité quotidienne.
J'ai l'impression qu'avec une telle approche on va rapidement en
arriver (si ce n'est déjà fait) à commencer par enseigner Loki
pour
découvrir des patterns fabrique ou visiteur sous prétexte que c'est
plus haut niveau et que l'on pourra voir les détails ensuite... Et
là
il y aura des "vieux réacs" pour avoir l'impression que l'on apprend
à
qqun à conduire une voiture en le mettant aux commandes d'une
Formule
1.
Je vois pour ma part des personnes qui connaissent des langages
évolués, dont le C++, et qui savent faire des bons trucs mais,
quand
on gratte la surface pour aller sur un comportement plus bas niveau,
il n'y a plus personne.
Je ne critique pas telle ou telle approche éducative : je dis juste
que, pour *mon contexte*, les pointeurs *c'est la base* et que celui
qui ne maîtrise pas ça, il ne maîtrise rien.
C'est pour cela que j'ai, légitimement je pense, un peu "peur" quand
on veut faire passer le C++ pour un langage de haut-niveau : dans
beaucoup de contextes, même si on essaie de faire évoluer les
choses,
cela n'est pas la réalité quotidienne.
J'ai l'impression qu'avec une telle approche on va rapidement en
arriver (si ce n'est déjà fait) à commencer par enseigner Loki
pour
découvrir des patterns fabrique ou visiteur sous prétexte que c'est
plus haut niveau et que l'on pourra voir les détails ensuite... Et
là
il y aura des "vieux réacs" pour avoir l'impression que l'on apprend
à
qqun à conduire une voiture en le mettant aux commandes d'une
Formule
1.
Je vois pour ma part des personnes qui connaissent des langages
évolués, dont le C++, et qui savent faire des bons trucs mais, quand
on gratte la surface pour aller sur un comportement plus bas niveau,
il n'y a plus personne.
Je vois pour ma part des personnes qui connaissent des langages
évolués, dont le C++, et qui savent faire des bons trucs mais, quand
on gratte la surface pour aller sur un comportement plus bas niveau,
il n'y a plus personne.
Je vois pour ma part des personnes qui connaissent des langages
évolués, dont le C++, et qui savent faire des bons trucs mais, quand
on gratte la surface pour aller sur un comportement plus bas niveau,
il n'y a plus personne.
Pardon ?
Pardon ?
Pardon ?
Olivier Azeau wrote:C'est exactement ce qui me gêne : "les apprendre plus tard".
Si j'apprends avec un radar de recul, qu'est ce qui va me motiver pour
*ensuite* apprendre sans ?
Pareil pour les pointeurs : personne ne me fera écrire une classe string
à la main si qqun d'autre m'a déja montré std::string
Non, et c'est très bien. Par contre, quand on te montrera comment
utiliser un schmurtzHandle* manuellement, tu n'auras qu'une envie :
Créer une classe Schmurtz, qui sera à un schmurtzHandle* ce que
std::string est à char *.
Et donc tu apprendras à faire ce genre de classe, mais en plus, tu auras
un exemple pour te guider dans tes choix.
Olivier Azeau wrote:
C'est exactement ce qui me gêne : "les apprendre plus tard".
Si j'apprends avec un radar de recul, qu'est ce qui va me motiver pour
*ensuite* apprendre sans ?
Pareil pour les pointeurs : personne ne me fera écrire une classe string
à la main si qqun d'autre m'a déja montré std::string
Non, et c'est très bien. Par contre, quand on te montrera comment
utiliser un schmurtzHandle* manuellement, tu n'auras qu'une envie :
Créer une classe Schmurtz, qui sera à un schmurtzHandle* ce que
std::string est à char *.
Et donc tu apprendras à faire ce genre de classe, mais en plus, tu auras
un exemple pour te guider dans tes choix.
Olivier Azeau wrote:C'est exactement ce qui me gêne : "les apprendre plus tard".
Si j'apprends avec un radar de recul, qu'est ce qui va me motiver pour
*ensuite* apprendre sans ?
Pareil pour les pointeurs : personne ne me fera écrire une classe string
à la main si qqun d'autre m'a déja montré std::string
Non, et c'est très bien. Par contre, quand on te montrera comment
utiliser un schmurtzHandle* manuellement, tu n'auras qu'une envie :
Créer une classe Schmurtz, qui sera à un schmurtzHandle* ce que
std::string est à char *.
Et donc tu apprendras à faire ce genre de classe, mais en plus, tu auras
un exemple pour te guider dans tes choix.
wrote in news:1103017263.964491.104460
@f14g2000cwb.googlegroups.com:<petite parenthèse>Si on est concerné par la question de la vitesse, AMHA, la
première chose à faire serait de supprimer l'allocation si la
destination a déjà la bonne taille, c-à-d quelque chose du
genre
:
double * newval =
( taille == other.taille ? val : new double[ other.taille ] )
;
std::copy( other.val, other.val + other.taille, newval ) ;
if ( newval != val ) delete [] val ;
val = newval ;
taille = other.taille ; return *this ;
Dans ce cas particulier où l'on gère des doubles c'est OK. Dans
le
cas plus générique où l'on pourrait avoir un vecteur de
n'importe
quoi, et en particulier des choses dont les copies peuvent lever
des exceptions, cette méthode n'est plus bonne dans la mesure où
elle invaliderait l'objet que l'on tentait de modifer, si une
exception apparait durant le std::copy.
Ah bon. Il me semble que si l'opérateur d'affectation de l'object
est lui-même exception-safe, le tableau restera valid. On ne
saurait
pas exactement ce qu'il contient, mais typiquement, ça ne fait
rien,
parce qu'il serait de toute façon detruite lors du nettoyage de la
pile.
Si il est exception-safe (comme avec les doubles), c'est OK. Mais
s'il
n'est qu'exception-neutral (l'état de l'objet reste inmodifié, mais
l'exception est bien levée), alors les premiers éléments peuvent
être
bien copiés, mais pas les derniers.
Au niveau mémoire il n'y a pas de problème. Côté cohérence de la
donnée, je ne suis pas persuadé que l'on peut toujours être sûr
que ce
n'est pas grâve.
Je ne vois pas ce qui garantit, toujours, le nétoyage de la pile en
fait
Il y a toujours moyen de trouver une situation où la donnée
(tableau)
que l'on veut modifier (par affectation) a une durée de vie qui
englobe le bloc try-catch qui va traiter l'exception.
Bref, cela dépend clairement de comment on veut l'utiliser. Dans
l'absolu, ce n'est pas systématiquement utilisable dans une solution
générique. (ce n'est bien qu'une parenthèse)
kanze@gabi-soft.fr wrote in news:1103017263.964491.104460
@f14g2000cwb.googlegroups.com:
<petite parenthèse>
Si on est concerné par la question de la vitesse, AMHA, la
première chose à faire serait de supprimer l'allocation si la
destination a déjà la bonne taille, c-à-d quelque chose du
genre
:
double * newval =
( taille == other.taille ? val : new double[ other.taille ] )
;
std::copy( other.val, other.val + other.taille, newval ) ;
if ( newval != val ) delete [] val ;
val = newval ;
taille = other.taille ; return *this ;
Dans ce cas particulier où l'on gère des doubles c'est OK. Dans
le
cas plus générique où l'on pourrait avoir un vecteur de
n'importe
quoi, et en particulier des choses dont les copies peuvent lever
des exceptions, cette méthode n'est plus bonne dans la mesure où
elle invaliderait l'objet que l'on tentait de modifer, si une
exception apparait durant le std::copy.
Ah bon. Il me semble que si l'opérateur d'affectation de l'object
est lui-même exception-safe, le tableau restera valid. On ne
saurait
pas exactement ce qu'il contient, mais typiquement, ça ne fait
rien,
parce qu'il serait de toute façon detruite lors du nettoyage de la
pile.
Si il est exception-safe (comme avec les doubles), c'est OK. Mais
s'il
n'est qu'exception-neutral (l'état de l'objet reste inmodifié, mais
l'exception est bien levée), alors les premiers éléments peuvent
être
bien copiés, mais pas les derniers.
Au niveau mémoire il n'y a pas de problème. Côté cohérence de la
donnée, je ne suis pas persuadé que l'on peut toujours être sûr
que ce
n'est pas grâve.
Je ne vois pas ce qui garantit, toujours, le nétoyage de la pile en
fait
Il y a toujours moyen de trouver une situation où la donnée
(tableau)
que l'on veut modifier (par affectation) a une durée de vie qui
englobe le bloc try-catch qui va traiter l'exception.
Bref, cela dépend clairement de comment on veut l'utiliser. Dans
l'absolu, ce n'est pas systématiquement utilisable dans une solution
générique. (ce n'est bien qu'une parenthèse)
wrote in news:1103017263.964491.104460
@f14g2000cwb.googlegroups.com:<petite parenthèse>Si on est concerné par la question de la vitesse, AMHA, la
première chose à faire serait de supprimer l'allocation si la
destination a déjà la bonne taille, c-à-d quelque chose du
genre
:
double * newval =
( taille == other.taille ? val : new double[ other.taille ] )
;
std::copy( other.val, other.val + other.taille, newval ) ;
if ( newval != val ) delete [] val ;
val = newval ;
taille = other.taille ; return *this ;
Dans ce cas particulier où l'on gère des doubles c'est OK. Dans
le
cas plus générique où l'on pourrait avoir un vecteur de
n'importe
quoi, et en particulier des choses dont les copies peuvent lever
des exceptions, cette méthode n'est plus bonne dans la mesure où
elle invaliderait l'objet que l'on tentait de modifer, si une
exception apparait durant le std::copy.
Ah bon. Il me semble que si l'opérateur d'affectation de l'object
est lui-même exception-safe, le tableau restera valid. On ne
saurait
pas exactement ce qu'il contient, mais typiquement, ça ne fait
rien,
parce qu'il serait de toute façon detruite lors du nettoyage de la
pile.
Si il est exception-safe (comme avec les doubles), c'est OK. Mais
s'il
n'est qu'exception-neutral (l'état de l'objet reste inmodifié, mais
l'exception est bien levée), alors les premiers éléments peuvent
être
bien copiés, mais pas les derniers.
Au niveau mémoire il n'y a pas de problème. Côté cohérence de la
donnée, je ne suis pas persuadé que l'on peut toujours être sûr
que ce
n'est pas grâve.
Je ne vois pas ce qui garantit, toujours, le nétoyage de la pile en
fait
Il y a toujours moyen de trouver une situation où la donnée
(tableau)
que l'on veut modifier (par affectation) a une durée de vie qui
englobe le bloc try-catch qui va traiter l'exception.
Bref, cela dépend clairement de comment on veut l'utiliser. Dans
l'absolu, ce n'est pas systématiquement utilisable dans une solution
générique. (ce n'est bien qu'une parenthèse)
wrote:Olivier Azeau wrote:
- Apprendre d'abord à faire des créneaux avec le radar de recul,
puis ensuite sans, ne serait peut-être pas une mauvaise idée.
Si
on ne l'a pas essayée encore, c'est sans doute que les radar de
recul sont encore assez rare. Il n'est pas question que les
élèves
n'apprenent jamais des pointeurs. Seulement qu'ils les apprenent
plus tard, quand ils ont déjà maîtriser des choses plus
simples.
C'est exactement ce qui me gêne : "les apprendre plus tard". Si
j'apprends avec un radar de recul, qu'est ce qui va me motiver pour
*ensuite* apprendre sans ?
Pareil pour les pointeurs : personne ne me fera écrire une classe
string à la main si qqun d'autre m'a déja montré std::string
J'ajouterai que cette philosophie n'est pas vraiment une
innovation,
sauf dans la mésure qu'elle s'applique au C++ (et encore -- j'ai
vu
de l'enseignement de C++ il y a 15 ans qui se servait des classes
de
String et d'Array « maison » pour éviter d'avoir à aborder les
pointeurs trop tôt). C'est en fait l'ordre classique dans d'autres
langages, comme Pascal. (Voir l'ordre de présentation de Wirth,
par
exemple.) Je dirais qu'on enseigne le C++ comme ça, c'est une
signe
d'une certaine maturité.
De quelle "maturité" parle-t-on ?
Celle où on forme des gens au C++ en leur apprenant à faire un
paquet
de trucs sans pointeurs, pointeurs qu'un certain nombre d'entre eux
ne
maîtriseront jamais ?
kanze@gabi-soft.fr wrote:
Olivier Azeau wrote:
- Apprendre d'abord à faire des créneaux avec le radar de recul,
puis ensuite sans, ne serait peut-être pas une mauvaise idée.
Si
on ne l'a pas essayée encore, c'est sans doute que les radar de
recul sont encore assez rare. Il n'est pas question que les
élèves
n'apprenent jamais des pointeurs. Seulement qu'ils les apprenent
plus tard, quand ils ont déjà maîtriser des choses plus
simples.
C'est exactement ce qui me gêne : "les apprendre plus tard". Si
j'apprends avec un radar de recul, qu'est ce qui va me motiver pour
*ensuite* apprendre sans ?
Pareil pour les pointeurs : personne ne me fera écrire une classe
string à la main si qqun d'autre m'a déja montré std::string
J'ajouterai que cette philosophie n'est pas vraiment une
innovation,
sauf dans la mésure qu'elle s'applique au C++ (et encore -- j'ai
vu
de l'enseignement de C++ il y a 15 ans qui se servait des classes
de
String et d'Array « maison » pour éviter d'avoir à aborder les
pointeurs trop tôt). C'est en fait l'ordre classique dans d'autres
langages, comme Pascal. (Voir l'ordre de présentation de Wirth,
par
exemple.) Je dirais qu'on enseigne le C++ comme ça, c'est une
signe
d'une certaine maturité.
De quelle "maturité" parle-t-on ?
Celle où on forme des gens au C++ en leur apprenant à faire un
paquet
de trucs sans pointeurs, pointeurs qu'un certain nombre d'entre eux
ne
maîtriseront jamais ?
wrote:Olivier Azeau wrote:
- Apprendre d'abord à faire des créneaux avec le radar de recul,
puis ensuite sans, ne serait peut-être pas une mauvaise idée.
Si
on ne l'a pas essayée encore, c'est sans doute que les radar de
recul sont encore assez rare. Il n'est pas question que les
élèves
n'apprenent jamais des pointeurs. Seulement qu'ils les apprenent
plus tard, quand ils ont déjà maîtriser des choses plus
simples.
C'est exactement ce qui me gêne : "les apprendre plus tard". Si
j'apprends avec un radar de recul, qu'est ce qui va me motiver pour
*ensuite* apprendre sans ?
Pareil pour les pointeurs : personne ne me fera écrire une classe
string à la main si qqun d'autre m'a déja montré std::string
J'ajouterai que cette philosophie n'est pas vraiment une
innovation,
sauf dans la mésure qu'elle s'applique au C++ (et encore -- j'ai
vu
de l'enseignement de C++ il y a 15 ans qui se servait des classes
de
String et d'Array « maison » pour éviter d'avoir à aborder les
pointeurs trop tôt). C'est en fait l'ordre classique dans d'autres
langages, comme Pascal. (Voir l'ordre de présentation de Wirth,
par
exemple.) Je dirais qu'on enseigne le C++ comme ça, c'est une
signe
d'une certaine maturité.
De quelle "maturité" parle-t-on ?
Celle où on forme des gens au C++ en leur apprenant à faire un
paquet
de trucs sans pointeurs, pointeurs qu'un certain nombre d'entre eux
ne
maîtriseront jamais ?
En C (et en C++), il y a aussi l'arithmétique sur pointeurs -- le
pointeur en C ou en C++, c'est vraiment le pointeur au niveau hardware.
Et souvent, quand on parle d'enseigner les pointeurs, c'est de ça
qu'on
parle. Or, ça, c'est bon si on fait un cours sur la programmation de
bas
niveau (ce qu'on doit faire si on veut devenir ingenieur en
informatique, disons à la troisième ou à la quatrième année). Mais
personnellement, je n'en vois pas l'intérêt dans un cours « C++ »,
où le
seul but est d'apprendre aux gens d'écrire des programmes. Pourquoi
enseigner quelque chose qui ne doit jamais servir à la plupart des
élèves ?
En C (et en C++), il y a aussi l'arithmétique sur pointeurs -- le
pointeur en C ou en C++, c'est vraiment le pointeur au niveau hardware.
Et souvent, quand on parle d'enseigner les pointeurs, c'est de ça
qu'on
parle. Or, ça, c'est bon si on fait un cours sur la programmation de
bas
niveau (ce qu'on doit faire si on veut devenir ingenieur en
informatique, disons à la troisième ou à la quatrième année). Mais
personnellement, je n'en vois pas l'intérêt dans un cours « C++ »,
où le
seul but est d'apprendre aux gens d'écrire des programmes. Pourquoi
enseigner quelque chose qui ne doit jamais servir à la plupart des
élèves ?
En C (et en C++), il y a aussi l'arithmétique sur pointeurs -- le
pointeur en C ou en C++, c'est vraiment le pointeur au niveau hardware.
Et souvent, quand on parle d'enseigner les pointeurs, c'est de ça
qu'on
parle. Or, ça, c'est bon si on fait un cours sur la programmation de
bas
niveau (ce qu'on doit faire si on veut devenir ingenieur en
informatique, disons à la troisième ou à la quatrième année). Mais
personnellement, je n'en vois pas l'intérêt dans un cours « C++ »,
où le
seul but est d'apprendre aux gens d'écrire des programmes. Pourquoi
enseigner quelque chose qui ne doit jamais servir à la plupart des
élèves ?