Quand tu auras dépatouillé tout ça, le prochain problème qui devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer temporaire
avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
Quand tu auras dépatouillé tout ça, le prochain problème qui devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer temporaire
avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
Quand tu auras dépatouillé tout ça, le prochain problème qui devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer temporaire
avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
En
revanche, je retiens l'idée du test unitaire (pour les classes,
encapsulant des ressources, qui ont une sémantique de valeur).
Ceci dit, il ne vérifie pas le problème des ressources manipulées de
manière non atomique. Je ne sais pas si il y a moyen de _localement_
surcharger l'allocation de ressource pour la forcer à planter dans le
cadre du test unitaire.
En
revanche, je retiens l'idée du test unitaire (pour les classes,
encapsulant des ressources, qui ont une sémantique de valeur).
Ceci dit, il ne vérifie pas le problème des ressources manipulées de
manière non atomique. Je ne sais pas si il y a moyen de _localement_
surcharger l'allocation de ressource pour la forcer à planter dans le
cadre du test unitaire.
En
revanche, je retiens l'idée du test unitaire (pour les classes,
encapsulant des ressources, qui ont une sémantique de valeur).
Ceci dit, il ne vérifie pas le problème des ressources manipulées de
manière non atomique. Je ne sais pas si il y a moyen de _localement_
surcharger l'allocation de ressource pour la forcer à planter dans le
cadre du test unitaire.
Olivier Azeau wrote in
news:4L2vd.3783$:Quand tu auras dépatouillé tout ça, le prochain problème qui devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer temporaire
avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
Je préfère bannir ce test, pessimiste, qui est susceptible de cacher des
problèmes plus profonds et sournois qu'il ne résoud nullement.
Olivier Azeau <john@doe.com> wrote in
news:4L2vd.3783$Of5.2744@nntpserver.swip.net:
Quand tu auras dépatouillé tout ça, le prochain problème qui devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer temporaire
avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
Je préfère bannir ce test, pessimiste, qui est susceptible de cacher des
problèmes plus profonds et sournois qu'il ne résoud nullement.
Olivier Azeau wrote in
news:4L2vd.3783$:Quand tu auras dépatouillé tout ça, le prochain problème qui devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer temporaire
avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
Je préfère bannir ce test, pessimiste, qui est susceptible de cacher des
problèmes plus profonds et sournois qu'il ne résoud nullement.
Luc Hermitte wrote:Olivier Azeau wrote in
news:4L2vd.3783$:Quand tu auras dépatouillé tout ça, le prochain problème qui
devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer
temporaire avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part
rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
Je préfère bannir ce test, pessimiste, qui est susceptible de
cacher
des problèmes plus profonds et sournois qu'il ne résoud
nullement.
Tu veux dire que si tu as une classe qui alloue un buffer de n
octets,
tu vas toujours coder l'operator= avec une copie du buffer alors
qu'il
est si simple de vérifier qu'il n'y a strictement rien à faire ?
Luc Hermitte wrote:
Olivier Azeau <john@doe.com> wrote in
news:4L2vd.3783$Of5.2744@nntpserver.swip.net:
Quand tu auras dépatouillé tout ça, le prochain problème qui
devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer
temporaire avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part
rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
Je préfère bannir ce test, pessimiste, qui est susceptible de
cacher
des problèmes plus profonds et sournois qu'il ne résoud
nullement.
Tu veux dire que si tu as une classe qui alloue un buffer de n
octets,
tu vas toujours coder l'operator= avec une copie du buffer alors
qu'il
est si simple de vérifier qu'il n'y a strictement rien à faire ?
Luc Hermitte wrote:Olivier Azeau wrote in
news:4L2vd.3783$:Quand tu auras dépatouillé tout ça, le prochain problème qui
devrait
survenir, ça sera probablement qqe chose comme :
Vecteur v(5);
v = v;
Tant qu'il travaille dans l'ordre (préparation d'un buffer
temporaire avant destruction/échange) il n'y a aucun problème.
[... snip test unitaire xxxCHECK_xxx(v = v)...]
Sur la façon d'éviter le problème, je préfère pour ma part
rajouter
"if(&v == this) return *this;" qui est beaucoup plus explicite.
Je préfère bannir ce test, pessimiste, qui est susceptible de
cacher
des problèmes plus profonds et sournois qu'il ne résoud
nullement.
Tu veux dire que si tu as une classe qui alloue un buffer de n
octets,
tu vas toujours coder l'operator= avec une copie du buffer alors
qu'il
est si simple de vérifier qu'il n'y a strictement rien à faire ?
Yoxoman writes:
| Je me permet de vous soumettre ce petit programme, qui représente
en
| gros la partie qui me pose problème d'un truc plus gros :
Si tu es débutant, comme tu l'indiques dans le sujet, je te
suggèrrerais de laisser de côté la gestion manuelle d'allocation
dynamique et d'y revenir bien plus tard, quand tu as compris
certaines
notions fondamentales de C++. En particuloer, je te suggèrerais
d'utiliser le type standard std:vector<int>.
Yoxoman <yoxoman@aol.com> writes:
| Je me permet de vous soumettre ce petit programme, qui représente
en
| gros la partie qui me pose problème d'un truc plus gros :
Si tu es débutant, comme tu l'indiques dans le sujet, je te
suggèrrerais de laisser de côté la gestion manuelle d'allocation
dynamique et d'y revenir bien plus tard, quand tu as compris
certaines
notions fondamentales de C++. En particuloer, je te suggèrerais
d'utiliser le type standard std:vector<int>.
Yoxoman writes:
| Je me permet de vous soumettre ce petit programme, qui représente
en
| gros la partie qui me pose problème d'un truc plus gros :
Si tu es débutant, comme tu l'indiques dans le sujet, je te
suggèrrerais de laisser de côté la gestion manuelle d'allocation
dynamique et d'y revenir bien plus tard, quand tu as compris
certaines
notions fondamentales de C++. En particuloer, je te suggèrerais
d'utiliser le type standard std:vector<int>.
Gabriel Dos Reis wrote:Olivier Azeau writes:
| Apprendre à se servir des templates et de la STL ? C'est ça les
| bases ?
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.
Cela n'a pas grand sens de se lancer dans la conception d'une
classe, quand on ne connaît pas les outils fondamentaux 101. Ah,
c'est vrai j'oubliais il y a encore un certain nombre de gens qui
pensent que C++ doit s'apprendre ou s'enseigner comme eux ils l'ont
appirs il y a plus d'une décennie, alors le langage d'aujourd'hui
est vachement différent. CIl ne reste plus qu'à espérer que la
promotion naturelle les sortira de la circulation, le plus
rapidement possible.
D'ailleurs nombre d'entre eux sont déjà sortis du dev C++ :
maintenant
ils ne font que recruter et superviser les développeurs...
Malheureusement, ils le font avec leurs propres critères et sont
souvent desespérés de voir le nombre de développeurs qui se
comportent
avec le C++ comme si c'était du Java...
Gabriel Dos Reis wrote:
Olivier Azeau <john@doe.com> writes:
| Apprendre à se servir des templates et de la STL ? C'est ça les
| bases ?
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.
Cela n'a pas grand sens de se lancer dans la conception d'une
classe, quand on ne connaît pas les outils fondamentaux 101. Ah,
c'est vrai j'oubliais il y a encore un certain nombre de gens qui
pensent que C++ doit s'apprendre ou s'enseigner comme eux ils l'ont
appirs il y a plus d'une décennie, alors le langage d'aujourd'hui
est vachement différent. CIl ne reste plus qu'à espérer que la
promotion naturelle les sortira de la circulation, le plus
rapidement possible.
D'ailleurs nombre d'entre eux sont déjà sortis du dev C++ :
maintenant
ils ne font que recruter et superviser les développeurs...
Malheureusement, ils le font avec leurs propres critères et sont
souvent desespérés de voir le nombre de développeurs qui se
comportent
avec le C++ comme si c'était du Java...
Gabriel Dos Reis wrote:Olivier Azeau writes:
| Apprendre à se servir des templates et de la STL ? C'est ça les
| bases ?
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.
Cela n'a pas grand sens de se lancer dans la conception d'une
classe, quand on ne connaît pas les outils fondamentaux 101. Ah,
c'est vrai j'oubliais il y a encore un certain nombre de gens qui
pensent que C++ doit s'apprendre ou s'enseigner comme eux ils l'ont
appirs il y a plus d'une décennie, alors le langage d'aujourd'hui
est vachement différent. CIl ne reste plus qu'à espérer que la
promotion naturelle les sortira de la circulation, le plus
rapidement possible.
D'ailleurs nombre d'entre eux sont déjà sortis du dev C++ :
maintenant
ils ne font que recruter et superviser les développeurs...
Malheureusement, ils le font avec leurs propres critères et sont
souvent desespérés de voir le nombre de développeurs qui se
comportent
avec le C++ comme si c'était du Java...
Olivier Azeau writes:
[...]
| Un développeur qui connait pas trop mal Java et qui se met au C++
ça
| ressemble un peu à un qqun qui a appris à conduire avec une boite
| automatique et se met à conduire avec une boite manuelle : il
| connait le volant, l'accélérateur et le frein mais s'il reste en
| 1ère, il n'ira pas bien loin.
| C'est pour cela que je trouve dangereux d'apprendre le C++ avec
| toute la STL comme "faisant partie du langage". La STL est au C++,
| ce que le régulateur de vitesse automatique est à la conduite :
un
| fabuleux outil pour celui qui le maîtrise et un bon moyen de finir
| dans le décor pour les autres.
Proof by analogy is fraud.
Comme nous allons le voir. Olivier nous énonce :
Un développeur qui connait pas trop mal Java et qui se met au
C++
ça ressemble un peu à un qqun qui a appris à conduire avec une
boite automatique et se met à conduire avec une boite manuelle :
il connait le volant, l'accélérateur et le frein mais s'il
reste
en 1ère, il n'ira pas bien loin.
Olivier Azeau <john@doe.com> writes:
[...]
| Un développeur qui connait pas trop mal Java et qui se met au C++
ça
| ressemble un peu à un qqun qui a appris à conduire avec une boite
| automatique et se met à conduire avec une boite manuelle : il
| connait le volant, l'accélérateur et le frein mais s'il reste en
| 1ère, il n'ira pas bien loin.
| C'est pour cela que je trouve dangereux d'apprendre le C++ avec
| toute la STL comme "faisant partie du langage". La STL est au C++,
| ce que le régulateur de vitesse automatique est à la conduite :
un
| fabuleux outil pour celui qui le maîtrise et un bon moyen de finir
| dans le décor pour les autres.
Proof by analogy is fraud.
Comme nous allons le voir. Olivier nous énonce :
Un développeur qui connait pas trop mal Java et qui se met au
C++
ça ressemble un peu à un qqun qui a appris à conduire avec une
boite automatique et se met à conduire avec une boite manuelle :
il connait le volant, l'accélérateur et le frein mais s'il
reste
en 1ère, il n'ira pas bien loin.
Olivier Azeau writes:
[...]
| Un développeur qui connait pas trop mal Java et qui se met au C++
ça
| ressemble un peu à un qqun qui a appris à conduire avec une boite
| automatique et se met à conduire avec une boite manuelle : il
| connait le volant, l'accélérateur et le frein mais s'il reste en
| 1ère, il n'ira pas bien loin.
| C'est pour cela que je trouve dangereux d'apprendre le C++ avec
| toute la STL comme "faisant partie du langage". La STL est au C++,
| ce que le régulateur de vitesse automatique est à la conduite :
un
| fabuleux outil pour celui qui le maîtrise et un bon moyen de finir
| dans le décor pour les autres.
Proof by analogy is fraud.
Comme nous allons le voir. Olivier nous énonce :
Un développeur qui connait pas trop mal Java et qui se met au
C++
ça ressemble un peu à un qqun qui a appris à conduire avec une
boite automatique et se met à conduire avec une boite manuelle :
il connait le volant, l'accélérateur et le frein mais s'il
reste
en 1ère, il n'ira pas bien loin.
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.
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 ;
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.
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 ;
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.
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 ;