"Alain Naigeon" writes:
| Il y a autre chose : je n'ai pas pris l'initiave de reprendre ce débat ; il
| se
| trouve que, cette fois-ci, c'est quelqu'un (Olivier) qui, à vue de nez, a
| une expérience, y compris professionnelle. Peut-être même est-il chef
| de projet (?), et je me demande si ce n'était ton secret espoir quand
| tu as balancé une remarque sur les mauvais chefs de projets ;-)
Pardon ? Là, je ne te suis pas du tout. Toute explication que tu
approterais dans ce sens serait la bienvenue -- à moins bien sûr, que
tu ne retractes encore ton affirmation (ce qui deviendrait comme une
ennuyeuse habitude).
| Alors bon, je suis sûr que ton expérience d'enseignement est positive,
| mais toi tu sembles avoir du mal à admettre que d'autres fonctionnent
| aussi.
Mais pas du tout. Je veux simplement voir ces autres approches
marcher. Ce que je dis, c'est que j'ai trop vu en pratique les
approches dont il était question mener à un résultat déplorable.
Je veux bien croire que c'est une constation unique. Mais lorsque je
regarde les approches pris des bouquins récents comme ceux de
Koenig&Moo, je me dis que ce n'est pas un phénomène local. J'ai aussi
lu des revues de ces bouquins qui enseignent le C++ comme si c'était
juste le C avec le mot clé « class ». Ce que je te propose, c'est de
regarder les données concrètes.
"Alain Naigeon" <anaigeon@free.fr> writes:
| Il y a autre chose : je n'ai pas pris l'initiave de reprendre ce débat ; il
| se
| trouve que, cette fois-ci, c'est quelqu'un (Olivier) qui, à vue de nez, a
| une expérience, y compris professionnelle. Peut-être même est-il chef
| de projet (?), et je me demande si ce n'était ton secret espoir quand
| tu as balancé une remarque sur les mauvais chefs de projets ;-)
Pardon ? Là, je ne te suis pas du tout. Toute explication que tu
approterais dans ce sens serait la bienvenue -- à moins bien sûr, que
tu ne retractes encore ton affirmation (ce qui deviendrait comme une
ennuyeuse habitude).
| Alors bon, je suis sûr que ton expérience d'enseignement est positive,
| mais toi tu sembles avoir du mal à admettre que d'autres fonctionnent
| aussi.
Mais pas du tout. Je veux simplement voir ces autres approches
marcher. Ce que je dis, c'est que j'ai trop vu en pratique les
approches dont il était question mener à un résultat déplorable.
Je veux bien croire que c'est une constation unique. Mais lorsque je
regarde les approches pris des bouquins récents comme ceux de
Koenig&Moo, je me dis que ce n'est pas un phénomène local. J'ai aussi
lu des revues de ces bouquins qui enseignent le C++ comme si c'était
juste le C avec le mot clé « class ». Ce que je te propose, c'est de
regarder les données concrètes.
"Alain Naigeon" writes:
| Il y a autre chose : je n'ai pas pris l'initiave de reprendre ce débat ; il
| se
| trouve que, cette fois-ci, c'est quelqu'un (Olivier) qui, à vue de nez, a
| une expérience, y compris professionnelle. Peut-être même est-il chef
| de projet (?), et je me demande si ce n'était ton secret espoir quand
| tu as balancé une remarque sur les mauvais chefs de projets ;-)
Pardon ? Là, je ne te suis pas du tout. Toute explication que tu
approterais dans ce sens serait la bienvenue -- à moins bien sûr, que
tu ne retractes encore ton affirmation (ce qui deviendrait comme une
ennuyeuse habitude).
| Alors bon, je suis sûr que ton expérience d'enseignement est positive,
| mais toi tu sembles avoir du mal à admettre que d'autres fonctionnent
| aussi.
Mais pas du tout. Je veux simplement voir ces autres approches
marcher. Ce que je dis, c'est que j'ai trop vu en pratique les
approches dont il était question mener à un résultat déplorable.
Je veux bien croire que c'est une constation unique. Mais lorsque je
regarde les approches pris des bouquins récents comme ceux de
Koenig&Moo, je me dis que ce n'est pas un phénomène local. J'ai aussi
lu des revues de ces bouquins qui enseignent le C++ comme si c'était
juste le C avec le mot clé « class ». Ce que je te propose, c'est de
regarder les données concrètes.
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
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
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
Je ne comprends plus rien, c'est trop retords pour moi.
Dans le brouillard où je suis, essayant de te comprendre,
je ne sais si cette remarque aura la
moindre pertinence : j'ai poursuivi la discussion car cet argument n'était
pas
le seul, la discussion avec toi et d'autres étant intéressante sur ce
point,
ce n'était
pas une raison suffisante pour l'arrêter : le simple fait que tu n'aie pas
utilisé l'argument
ne voulait évidement pas dire que tu as avais changé de position.
| Je te crédite (donc) d'une totale bonne foi, et c'est ça qui te pose
| problème ?
non, ce qui me pose problème, c'est ton incohérence.
| Je trouve que tu réponds souvent par des pirouettes (comme ce "donc"),
| et ce n'est pas la meilleure façon de rester bien installé entre ton
clavier| et ton écran ;-)
si prendre quelqu'un en flagrant délit d'incohérence est ce que tu
considères une pirouette alors je suis bien installé dans entre mon
clavier et mon écrna. Merci.
Bah tu sais, la cohérence peut aussi fonctionner comme une médaille,
sans rapport, parfois, avec ce qu'on est vraiment. Regarde un fil qui
vient
de parler, une fois de plus, de garbage collector. Moi qui, dans une
certaine
mesure, comprends et aime les pointeurs, eh bien, j'aimerais bien que le
langage propose (facultativement) un GC. Incohérence ? Par ailleurs, je
suis sûr que parmi les tenants de ta thèse concernant l'apprentissage
retardé
des pointeurs, il y a des gens farouchement opposés au GC. Incohérence ?
En fait je ne crois pas. Chaque partie accorde un poids différent au GC,
selon
son habitude des pointeurs et de ce qu'ils apportent. (comment faire une
liste
chaînée sans pointeurs ?) En oubliant le prix à payer de s'en passer, à
savoir
une certaine proportion d'erreurs de destruction. Mais les gens qui
manipulent
les pointeurs sont donc bien envie d'éviter cette gestion fastidieuse et
parfois
difficile carrément (notamment quand plusieurs objets sont confiés à
plusieurs
containers). Par conséquent, l'incohérence n'est qu'apparente, dans le cas
d'un GC facultatif : on gère tous les standard qui éviteront bien des
bévues
ou oublis, et l'on garde la possibilité de gerer soi-même les cas
particuliers
qu'on juge néfaste de leur confier (dans mon esprit un bon GC doit être
facultatif jusqu'au point de permettre de lui confier seulement certains
pointeurs ou types de pointeurs, les autres étant toujours gérés à la
main)
Moi j'ai fait une hastable template instanciée par le type du pointeur,
détruite en fin de programme. On lui confiait un pointeur par > on en
redevenait propriétaire par < Mais on peut aussi à tout moment lui
demander la destruction de l'objet pointé par un pointeur quelle possède,
et alors elle remet à zero ce pointeur qui pourrait être utilisé à tort
par
l'appelant si quelques lignes plus loin il a oublié la destruction.
L'idée à la base, c'est de régler un certains de motifs d'erreurs
fréquentes,
mais sans pénaliser l'occupation mémoire qui serait inacceptable dans
certains
cas si tous les pointeurs devaient rester intacts jusqu'à la fin de
l'exécution.
Quand la fin d'une étape rend inutile tous les objets concernés, eh bien,
il suffit d'avoir alloué statiquement le GC pour ce type au début d'un
bloc,
donc en sortie de bloc le GC détruit tout ce qui ne l'aurait pas été
explicitement
entre-temps. C'est simple, ça marche bien, mais évidemment ça necessite
une coopération honnête du code source (comme approche facultative,
il me semble).
Je ne comprends plus rien, c'est trop retords pour moi.
Dans le brouillard où je suis, essayant de te comprendre,
je ne sais si cette remarque aura la
moindre pertinence : j'ai poursuivi la discussion car cet argument n'était
pas
le seul, la discussion avec toi et d'autres étant intéressante sur ce
point,
ce n'était
pas une raison suffisante pour l'arrêter : le simple fait que tu n'aie pas
utilisé l'argument
ne voulait évidement pas dire que tu as avais changé de position.
| Je te crédite (donc) d'une totale bonne foi, et c'est ça qui te pose
| problème ?
non, ce qui me pose problème, c'est ton incohérence.
| Je trouve que tu réponds souvent par des pirouettes (comme ce "donc"),
| et ce n'est pas la meilleure façon de rester bien installé entre ton
clavier
| et ton écran ;-)
si prendre quelqu'un en flagrant délit d'incohérence est ce que tu
considères une pirouette alors je suis bien installé dans entre mon
clavier et mon écrna. Merci.
Bah tu sais, la cohérence peut aussi fonctionner comme une médaille,
sans rapport, parfois, avec ce qu'on est vraiment. Regarde un fil qui
vient
de parler, une fois de plus, de garbage collector. Moi qui, dans une
certaine
mesure, comprends et aime les pointeurs, eh bien, j'aimerais bien que le
langage propose (facultativement) un GC. Incohérence ? Par ailleurs, je
suis sûr que parmi les tenants de ta thèse concernant l'apprentissage
retardé
des pointeurs, il y a des gens farouchement opposés au GC. Incohérence ?
En fait je ne crois pas. Chaque partie accorde un poids différent au GC,
selon
son habitude des pointeurs et de ce qu'ils apportent. (comment faire une
liste
chaînée sans pointeurs ?) En oubliant le prix à payer de s'en passer, à
savoir
une certaine proportion d'erreurs de destruction. Mais les gens qui
manipulent
les pointeurs sont donc bien envie d'éviter cette gestion fastidieuse et
parfois
difficile carrément (notamment quand plusieurs objets sont confiés à
plusieurs
containers). Par conséquent, l'incohérence n'est qu'apparente, dans le cas
d'un GC facultatif : on gère tous les standard qui éviteront bien des
bévues
ou oublis, et l'on garde la possibilité de gerer soi-même les cas
particuliers
qu'on juge néfaste de leur confier (dans mon esprit un bon GC doit être
facultatif jusqu'au point de permettre de lui confier seulement certains
pointeurs ou types de pointeurs, les autres étant toujours gérés à la
main)
Moi j'ai fait une hastable template instanciée par le type du pointeur,
détruite en fin de programme. On lui confiait un pointeur par > on en
redevenait propriétaire par < Mais on peut aussi à tout moment lui
demander la destruction de l'objet pointé par un pointeur quelle possède,
et alors elle remet à zero ce pointeur qui pourrait être utilisé à tort
par
l'appelant si quelques lignes plus loin il a oublié la destruction.
L'idée à la base, c'est de régler un certains de motifs d'erreurs
fréquentes,
mais sans pénaliser l'occupation mémoire qui serait inacceptable dans
certains
cas si tous les pointeurs devaient rester intacts jusqu'à la fin de
l'exécution.
Quand la fin d'une étape rend inutile tous les objets concernés, eh bien,
il suffit d'avoir alloué statiquement le GC pour ce type au début d'un
bloc,
donc en sortie de bloc le GC détruit tout ce qui ne l'aurait pas été
explicitement
entre-temps. C'est simple, ça marche bien, mais évidemment ça necessite
une coopération honnête du code source (comme approche facultative,
il me semble).
Je ne comprends plus rien, c'est trop retords pour moi.
Dans le brouillard où je suis, essayant de te comprendre,
je ne sais si cette remarque aura la
moindre pertinence : j'ai poursuivi la discussion car cet argument n'était
pas
le seul, la discussion avec toi et d'autres étant intéressante sur ce
point,
ce n'était
pas une raison suffisante pour l'arrêter : le simple fait que tu n'aie pas
utilisé l'argument
ne voulait évidement pas dire que tu as avais changé de position.
| Je te crédite (donc) d'une totale bonne foi, et c'est ça qui te pose
| problème ?
non, ce qui me pose problème, c'est ton incohérence.
| Je trouve que tu réponds souvent par des pirouettes (comme ce "donc"),
| et ce n'est pas la meilleure façon de rester bien installé entre ton
clavier| et ton écran ;-)
si prendre quelqu'un en flagrant délit d'incohérence est ce que tu
considères une pirouette alors je suis bien installé dans entre mon
clavier et mon écrna. Merci.
Bah tu sais, la cohérence peut aussi fonctionner comme une médaille,
sans rapport, parfois, avec ce qu'on est vraiment. Regarde un fil qui
vient
de parler, une fois de plus, de garbage collector. Moi qui, dans une
certaine
mesure, comprends et aime les pointeurs, eh bien, j'aimerais bien que le
langage propose (facultativement) un GC. Incohérence ? Par ailleurs, je
suis sûr que parmi les tenants de ta thèse concernant l'apprentissage
retardé
des pointeurs, il y a des gens farouchement opposés au GC. Incohérence ?
En fait je ne crois pas. Chaque partie accorde un poids différent au GC,
selon
son habitude des pointeurs et de ce qu'ils apportent. (comment faire une
liste
chaînée sans pointeurs ?) En oubliant le prix à payer de s'en passer, à
savoir
une certaine proportion d'erreurs de destruction. Mais les gens qui
manipulent
les pointeurs sont donc bien envie d'éviter cette gestion fastidieuse et
parfois
difficile carrément (notamment quand plusieurs objets sont confiés à
plusieurs
containers). Par conséquent, l'incohérence n'est qu'apparente, dans le cas
d'un GC facultatif : on gère tous les standard qui éviteront bien des
bévues
ou oublis, et l'on garde la possibilité de gerer soi-même les cas
particuliers
qu'on juge néfaste de leur confier (dans mon esprit un bon GC doit être
facultatif jusqu'au point de permettre de lui confier seulement certains
pointeurs ou types de pointeurs, les autres étant toujours gérés à la
main)
Moi j'ai fait une hastable template instanciée par le type du pointeur,
détruite en fin de programme. On lui confiait un pointeur par > on en
redevenait propriétaire par < Mais on peut aussi à tout moment lui
demander la destruction de l'objet pointé par un pointeur quelle possède,
et alors elle remet à zero ce pointeur qui pourrait être utilisé à tort
par
l'appelant si quelques lignes plus loin il a oublié la destruction.
L'idée à la base, c'est de régler un certains de motifs d'erreurs
fréquentes,
mais sans pénaliser l'occupation mémoire qui serait inacceptable dans
certains
cas si tous les pointeurs devaient rester intacts jusqu'à la fin de
l'exécution.
Quand la fin d'une étape rend inutile tous les objets concernés, eh bien,
il suffit d'avoir alloué statiquement le GC pour ce type au début d'un
bloc,
donc en sortie de bloc le GC détruit tout ce qui ne l'aurait pas été
explicitement
entre-temps. C'est simple, ça marche bien, mais évidemment ça necessite
une coopération honnête du code source (comme approche facultative,
il me semble).
wrote in
news::Il veut dire que si ton opérateur d'affectation est
exception-safe,
il va prèsque sûrement fonctionner correctement dans le cas
d'affectation sur lui-même, sans test particulier. Alors, le test
est un comparison de plus ; c'est une optimisation si on affecte
souvent à soi-même, mais une pessimisation dans les autres cas.
Oui.
<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.
kanze@gabi-soft.fr wrote in
news:1102928958.430048.302290@f14g2000cwb.googlegroups.com:
Il veut dire que si ton opérateur d'affectation est
exception-safe,
il va prèsque sûrement fonctionner correctement dans le cas
d'affectation sur lui-même, sans test particulier. Alors, le test
est un comparison de plus ; c'est une optimisation si on affecte
souvent à soi-même, mais une pessimisation dans les autres cas.
Oui.
<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.
wrote in
news::Il veut dire que si ton opérateur d'affectation est
exception-safe,
il va prèsque sûrement fonctionner correctement dans le cas
d'affectation sur lui-même, sans test particulier. Alors, le test
est un comparison de plus ; c'est une optimisation si on affecte
souvent à soi-même, mais une pessimisation dans les autres cas.
Oui.
<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.
a écrit dans le message news:
Et comme j'ai déjà dit par ailleurs, apprendre à conduire avec une
boîte automatique avant de conduire avec une boîte manuelle n'est
pas
forcement une mauvaise politique.
*pas forcément*, ok, voilà une expression méritoire et nécessaire
!
J'ai l'impression qu'aux USA on est absolument convaincu qu'on ne
peut
s'en sortir avec une boîte manuelle, et ça n'empêche pas des
centaines
de millions d'Européens de conduire ainsi tous les jours.
(ce n'était pas une réponse de James, qui, je crois, a une position
plus nuancée, c'était une réponse de Gaby, entre autres - l'argu-
ment
est revenu plus d'une fois. Quoiqu'il en soit, sur usenet en
général,
et sur ce groupe, je réagis à des idées, pas à des personnes).
<kanze@gabi-soft.fr> a écrit dans le message news:
1102930997.487717.107200@f14g2000cwb.googlegroups.com...
Et comme j'ai déjà dit par ailleurs, apprendre à conduire avec une
boîte automatique avant de conduire avec une boîte manuelle n'est
pas
forcement une mauvaise politique.
*pas forcément*, ok, voilà une expression méritoire et nécessaire
!
J'ai l'impression qu'aux USA on est absolument convaincu qu'on ne
peut
s'en sortir avec une boîte manuelle, et ça n'empêche pas des
centaines
de millions d'Européens de conduire ainsi tous les jours.
(ce n'était pas une réponse de James, qui, je crois, a une position
plus nuancée, c'était une réponse de Gaby, entre autres - l'argu-
ment
est revenu plus d'une fois. Quoiqu'il en soit, sur usenet en
général,
et sur ce groupe, je réagis à des idées, pas à des personnes).
a écrit dans le message news:
Et comme j'ai déjà dit par ailleurs, apprendre à conduire avec une
boîte automatique avant de conduire avec une boîte manuelle n'est
pas
forcement une mauvaise politique.
*pas forcément*, ok, voilà une expression méritoire et nécessaire
!
J'ai l'impression qu'aux USA on est absolument convaincu qu'on ne
peut
s'en sortir avec une boîte manuelle, et ça n'empêche pas des
centaines
de millions d'Européens de conduire ainsi tous les jours.
(ce n'était pas une réponse de James, qui, je crois, a une position
plus nuancée, c'était une réponse de Gaby, entre autres - l'argu-
ment
est revenu plus d'une fois. Quoiqu'il en soit, sur usenet en
général,
et sur ce groupe, je réagis à des idées, pas à des personnes).
wrote:Olivier Azeau wrote:Gabriel Dos Reis wrote:Apprendre à se servir de la bilbiothèque standard. Oui. On n'a
besoin d'aucun talent particulier des templates.
Ouais... C'est avec des arguments comme ça que les auto-écoles
vont
apprendre à faire les créneaux avec un radar de recul sous
prétexte
que c'est en "standard" sur les voitures.
Analogie, il me semble, serait plutôt des auto-écoles qui
apprendre
à démarrer la voiture, et de la faire avancer à la vitesse
voulue en
ligne droite, avant de apprendre à faire des créneaux en marche
en
arrière.
En ce qui concerne ton analogie, elle a plusieurs défauts :
- Les radars de recul ne sont pas standard. Il existe bien des
voitures qui ne les ont pas. Tandis que std::vector et
std::string
font bien partie de C++ -- s'ils ne sont pas présents, ce n'est
pas du C++.
Oui, d'où ma conjugaison au futur (qui j'espère est un futur
hypothétique)
- 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
kanze@gabi-soft.fr wrote:
Olivier Azeau wrote:
Gabriel Dos Reis wrote:
Apprendre à se servir de la bilbiothèque standard. Oui. On n'a
besoin d'aucun talent particulier des templates.
Ouais... C'est avec des arguments comme ça que les auto-écoles
vont
apprendre à faire les créneaux avec un radar de recul sous
prétexte
que c'est en "standard" sur les voitures.
Analogie, il me semble, serait plutôt des auto-écoles qui
apprendre
à démarrer la voiture, et de la faire avancer à la vitesse
voulue en
ligne droite, avant de apprendre à faire des créneaux en marche
en
arrière.
En ce qui concerne ton analogie, elle a plusieurs défauts :
- Les radars de recul ne sont pas standard. Il existe bien des
voitures qui ne les ont pas. Tandis que std::vector et
std::string
font bien partie de C++ -- s'ils ne sont pas présents, ce n'est
pas du C++.
Oui, d'où ma conjugaison au futur (qui j'espère est un futur
hypothétique)
- 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
wrote:Olivier Azeau wrote:Gabriel Dos Reis wrote:Apprendre à se servir de la bilbiothèque standard. Oui. On n'a
besoin d'aucun talent particulier des templates.
Ouais... C'est avec des arguments comme ça que les auto-écoles
vont
apprendre à faire les créneaux avec un radar de recul sous
prétexte
que c'est en "standard" sur les voitures.
Analogie, il me semble, serait plutôt des auto-écoles qui
apprendre
à démarrer la voiture, et de la faire avancer à la vitesse
voulue en
ligne droite, avant de apprendre à faire des créneaux en marche
en
arrière.
En ce qui concerne ton analogie, elle a plusieurs défauts :
- Les radars de recul ne sont pas standard. Il existe bien des
voitures qui ne les ont pas. Tandis que std::vector et
std::string
font bien partie de C++ -- s'ils ne sont pas présents, ce n'est
pas du C++.
Oui, d'où ma conjugaison au futur (qui j'espère est un futur
hypothétique)
- 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
<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.
<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.
<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.
wrote:Olivier Azeau wrote:
(SNIP)
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
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:
(SNIP)
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
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:
(SNIP)
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
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 ?