Je suis sur que le responsable de la faq sera ravi
d'accueillir ta "vérification" à moins que tu n'es pas le
temps de vérifier, juste celui de critiquer :)
Je suis sur que le responsable de la faq sera ravi
d'accueillir ta "vérification" à moins que tu n'es pas le
temps de vérifier, juste celui de critiquer :)
Je suis sur que le responsable de la faq sera ravi
d'accueillir ta "vérification" à moins que tu n'es pas le
temps de vérifier, juste celui de critiquer :)
mais
que developpez.com ne le connaisse pas, c'est plus embetant...
Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Pourquoi ? T'aurait-on fait croire que ce site contient des
informations valables ?
J'ai nettement l'impression que pour ce genre de site, l'important est
d'avoir la plus grande quantité possible de contenu. Du coup, aucune
vérification n'est effectuée.
mais
que developpez.com ne le connaisse pas, c'est plus embetant...
Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Pourquoi ? T'aurait-on fait croire que ce site contient des
informations valables ?
J'ai nettement l'impression que pour ce genre de site, l'important est
d'avoir la plus grande quantité possible de contenu. Du coup, aucune
vérification n'est effectuée.
mais
que developpez.com ne le connaisse pas, c'est plus embetant...
Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Pourquoi ? T'aurait-on fait croire que ce site contient des
informations valables ?
J'ai nettement l'impression que pour ce genre de site, l'important est
d'avoir la plus grande quantité possible de contenu. Du coup, aucune
vérification n'est effectuée.
Nous en prenons note et allons le préciser.
Et même pour le C++, si à
ses débuts cette section a effectivement eu tendance à "aspirer" tout ce
qui lui passait sous la main
Tu dois bien
savoir comme c'est difficile pour avoir initié la FAQ de
fr.comp.os.ms-windows.programmation
Nous avons conscience que le
Net manque de bonnes ressources en français sur ce sujet, mais que faire
? Ne rien proposer, ou faute de mieux mettre à disposition ce qui existe ?
Nous en prenons note et allons le préciser.
Et même pour le C++, si à
ses débuts cette section a effectivement eu tendance à "aspirer" tout ce
qui lui passait sous la main
Tu dois bien
savoir comme c'est difficile pour avoir initié la FAQ de
fr.comp.os.ms-windows.programmation
Nous avons conscience que le
Net manque de bonnes ressources en français sur ce sujet, mais que faire
? Ne rien proposer, ou faute de mieux mettre à disposition ce qui existe ?
Nous en prenons note et allons le préciser.
Et même pour le C++, si à
ses débuts cette section a effectivement eu tendance à "aspirer" tout ce
qui lui passait sous la main
Tu dois bien
savoir comme c'est difficile pour avoir initié la FAQ de
fr.comp.os.ms-windows.programmation
Nous avons conscience que le
Net manque de bonnes ressources en français sur ce sujet, mais que faire
? Ne rien proposer, ou faute de mieux mettre à disposition ce qui existe ?
Nous en prenons note et allons le préciser.
Ça me paraît effectivement important.
Sur un sujet aussi épineux que le changement de casse, toute méthode
devrait être accompagnée de ses limites de validité.
Et même pour le C++, si à
ses débuts cette section a effectivement eu tendance à "aspirer" tout ce
qui lui passait sous la main
C'est toujours le même problème : si tu pars d'un amoncellement de
trucs en vrac, même si tu améliores la qualité générale petit à petit,
il est très difficile pour le néophyte de savoir si tel ou tel
document est de bonne qualité ou pas.
Dans des cas comme ça, on s'en sort généralement en faisant un tri
systématique (i.e. tout document n'ayant pas été visé par un expert
est soit enlevé, soit mis dans une catégorie "documents de qualité
inconnue"), puis une campagne de publicité pour tenter d'enlever
l'image négative qu'on avait au départ.
Nous avons conscience que le
Net manque de bonnes ressources en français sur ce sujet, mais que faire
? Ne rien proposer, ou faute de mieux mettre à disposition ce qui existe ?
Bonne question...
Je dirais : mettre à disposition ce qui existe, en précisant bien que
c'est "faute de mieux".
Note qu'il faut distinguer entre trois types de publics :
- L'étudiant qui fait du C++ parce que c'est dans son cursus, mais qui
ne s'y intéresse pas particulièrement -- il voit juste la
programmation comme un moyen de gagner des points pour son diplôme. Il
lui faut donc apprendre, sans trop se fatiguer, les méthodes qui vont
satisfaire son prof, point final.
- L'amateur, qui considère la programmation comme un loisir. Il
n'apprendra jamais toutes les finesses du C++, faute de temps, mais ce
n'est pas bien grave.
- Le professionnel, qui programme toute la journée pour gagner sa vie.
Il lit l'anglais technique (c'est un prérequis), et a donc accès aux
ressources et livres anglophones. S'il est bien aiguillé, il
commencera sans doute son apprentissage par "Accelerated C++", qui
semble le livre le plus conseillé sur fclc++.
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant. Et sans
oublier d'inclure <algorithm>, <functional>, <iterator>, <local>
Si tu présentes une information incomplète et que tu connais une
ressource en anglais qui donne plus de précisions, il ne faut pas
hésiter à le dire. La plupart des gens qui visent un bon niveau en C++
savent lire l'anglais (ou devront l'apprendre un jour ou l'autre),
même s'ils commencent spontanément leur recherche par un site
francophone.
Nous en prenons note et allons le préciser.
Ça me paraît effectivement important.
Sur un sujet aussi épineux que le changement de casse, toute méthode
devrait être accompagnée de ses limites de validité.
Et même pour le C++, si à
ses débuts cette section a effectivement eu tendance à "aspirer" tout ce
qui lui passait sous la main
C'est toujours le même problème : si tu pars d'un amoncellement de
trucs en vrac, même si tu améliores la qualité générale petit à petit,
il est très difficile pour le néophyte de savoir si tel ou tel
document est de bonne qualité ou pas.
Dans des cas comme ça, on s'en sort généralement en faisant un tri
systématique (i.e. tout document n'ayant pas été visé par un expert
est soit enlevé, soit mis dans une catégorie "documents de qualité
inconnue"), puis une campagne de publicité pour tenter d'enlever
l'image négative qu'on avait au départ.
Nous avons conscience que le
Net manque de bonnes ressources en français sur ce sujet, mais que faire
? Ne rien proposer, ou faute de mieux mettre à disposition ce qui existe ?
Bonne question...
Je dirais : mettre à disposition ce qui existe, en précisant bien que
c'est "faute de mieux".
Note qu'il faut distinguer entre trois types de publics :
- L'étudiant qui fait du C++ parce que c'est dans son cursus, mais qui
ne s'y intéresse pas particulièrement -- il voit juste la
programmation comme un moyen de gagner des points pour son diplôme. Il
lui faut donc apprendre, sans trop se fatiguer, les méthodes qui vont
satisfaire son prof, point final.
- L'amateur, qui considère la programmation comme un loisir. Il
n'apprendra jamais toutes les finesses du C++, faute de temps, mais ce
n'est pas bien grave.
- Le professionnel, qui programme toute la journée pour gagner sa vie.
Il lit l'anglais technique (c'est un prérequis), et a donc accès aux
ressources et livres anglophones. S'il est bien aiguillé, il
commencera sans doute son apprentissage par "Accelerated C++", qui
semble le livre le plus conseillé sur fclc++.
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant. Et sans
oublier d'inclure <algorithm>, <functional>, <iterator>, <local>
Si tu présentes une information incomplète et que tu connais une
ressource en anglais qui donne plus de précisions, il ne faut pas
hésiter à le dire. La plupart des gens qui visent un bon niveau en C++
savent lire l'anglais (ou devront l'apprendre un jour ou l'autre),
même s'ils commencent spontanément leur recherche par un site
francophone.
Nous en prenons note et allons le préciser.
Ça me paraît effectivement important.
Sur un sujet aussi épineux que le changement de casse, toute méthode
devrait être accompagnée de ses limites de validité.
Et même pour le C++, si à
ses débuts cette section a effectivement eu tendance à "aspirer" tout ce
qui lui passait sous la main
C'est toujours le même problème : si tu pars d'un amoncellement de
trucs en vrac, même si tu améliores la qualité générale petit à petit,
il est très difficile pour le néophyte de savoir si tel ou tel
document est de bonne qualité ou pas.
Dans des cas comme ça, on s'en sort généralement en faisant un tri
systématique (i.e. tout document n'ayant pas été visé par un expert
est soit enlevé, soit mis dans une catégorie "documents de qualité
inconnue"), puis une campagne de publicité pour tenter d'enlever
l'image négative qu'on avait au départ.
Nous avons conscience que le
Net manque de bonnes ressources en français sur ce sujet, mais que faire
? Ne rien proposer, ou faute de mieux mettre à disposition ce qui existe ?
Bonne question...
Je dirais : mettre à disposition ce qui existe, en précisant bien que
c'est "faute de mieux".
Note qu'il faut distinguer entre trois types de publics :
- L'étudiant qui fait du C++ parce que c'est dans son cursus, mais qui
ne s'y intéresse pas particulièrement -- il voit juste la
programmation comme un moyen de gagner des points pour son diplôme. Il
lui faut donc apprendre, sans trop se fatiguer, les méthodes qui vont
satisfaire son prof, point final.
- L'amateur, qui considère la programmation comme un loisir. Il
n'apprendra jamais toutes les finesses du C++, faute de temps, mais ce
n'est pas bien grave.
- Le professionnel, qui programme toute la journée pour gagner sa vie.
Il lit l'anglais technique (c'est un prérequis), et a donc accès aux
ressources et livres anglophones. S'il est bien aiguillé, il
commencera sans doute son apprentissage par "Accelerated C++", qui
semble le livre le plus conseillé sur fclc++.
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant. Et sans
oublier d'inclure <algorithm>, <functional>, <iterator>, <local>
Si tu présentes une information incomplète et que tu connais une
ressource en anglais qui donne plus de précisions, il ne faut pas
hésiter à le dire. La plupart des gens qui visent un bon niveau en C++
savent lire l'anglais (ou devront l'apprendre un jour ou l'autre),
même s'ils commencent spontanément leur recherche par un site
francophone.
Franck Branjonneau wrote:"kanze" écrivait:Franck Branjonneau wrote:Yoxoman écrivait:La solution avec transform serait quelque chose du
genre :
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant.
Ca me fait penser à un film : Scanners. Ca parle de gens
capables de faire exploser le cerveau d'autres presonnes
à distance.
Si c'est le static_cast<> qui t'ennuie, tu peux l'enelever.
Tu en es sûr ?
Je n'ai aucune certitude.Il y a bien deux fonctions std::ctype<>::tolower, selon la
norme. C'est vrai que la deuxième prend deux paramètres, et
qu'il n'y a aucune instantiation de std::mem_fun qui accepte
l'adresse d'une fonction à deux paramètres.
Oui mais ce ne sont pas des fonctions templates. Ce sont des
fonctions membres d'une classe template std::ctype<>. Qui,
elle, a été instanciée avec char, le compilateur doit donc
choisir entre les deux signatures
std::ctype< char >::tolower(char) const;
std::ctype< char >::tolower(char, const char) const;
pour choisir quelle std::mem_fun<> utiliser.
C'est juste, mais je ne crois pas que ça change grand chose.
Pour déterminer les paramètres d'instantiation de
std::mem_fun<>, on se sert de la déduction des types, qui elle
ne fonctionne (je crois) qu'avec un type connu. Or, pour
connaître le type ici, il faut de la résolution du surcharge.
Si j'ai bien compris la norme, la résolution du surcharge ne se fait
qu'une fois la déduction des types finie ; de toute façon, il a
besoin de l'instantiation pour faire la résolution du surcharge.
Mais tes commentaires m'ont amené a regardé dans la norme. En
fait, §14.8.2.2 dit bien que « Template arguments can be deduced
from the type specified when taking the address of an overloaded
function. »
, et dans §14.8.2.4 :
In some cases, tye deduction is done using a single set of types
P and A. [P est le type du paramètre formel, et A le type du
paramètre réel].
Type deduction is done independantly for each P/A pair, and the
deduced template argument values are then combined. If type
decduction cannot be done for any P/A pair, or if for any pair
the deduction leads to more than one possible set of deduced
values, or if different pairs yield different deduced values, or
if any template argument remains neither deduced nor explicilty
specified, template argument deduction fails.
Ce qui n'est pas particulièrement clair.
Il y a bien deux analyses distinctes : la déduction des types,
et la résolution des surcharges.
Franck Branjonneau wrote:
"kanze" <kanze@gabi-soft.fr> écrivait:
Franck Branjonneau wrote:
Yoxoman <yoxoman@aol.com> écrivait:
La solution avec transform serait quelque chose du
genre :
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant.
Ca me fait penser à un film : Scanners. Ca parle de gens
capables de faire exploser le cerveau d'autres presonnes
à distance.
Si c'est le static_cast<> qui t'ennuie, tu peux l'enelever.
Tu en es sûr ?
Je n'ai aucune certitude.
Il y a bien deux fonctions std::ctype<>::tolower, selon la
norme. C'est vrai que la deuxième prend deux paramètres, et
qu'il n'y a aucune instantiation de std::mem_fun qui accepte
l'adresse d'une fonction à deux paramètres.
Oui mais ce ne sont pas des fonctions templates. Ce sont des
fonctions membres d'une classe template std::ctype<>. Qui,
elle, a été instanciée avec char, le compilateur doit donc
choisir entre les deux signatures
std::ctype< char >::tolower(char) const;
std::ctype< char >::tolower(char, const char) const;
pour choisir quelle std::mem_fun<> utiliser.
C'est juste, mais je ne crois pas que ça change grand chose.
Pour déterminer les paramètres d'instantiation de
std::mem_fun<>, on se sert de la déduction des types, qui elle
ne fonctionne (je crois) qu'avec un type connu. Or, pour
connaître le type ici, il faut de la résolution du surcharge.
Si j'ai bien compris la norme, la résolution du surcharge ne se fait
qu'une fois la déduction des types finie ; de toute façon, il a
besoin de l'instantiation pour faire la résolution du surcharge.
Mais tes commentaires m'ont amené a regardé dans la norme. En
fait, §14.8.2.2 dit bien que « Template arguments can be deduced
from the type specified when taking the address of an overloaded
function. »
, et dans §14.8.2.4 :
In some cases, tye deduction is done using a single set of types
P and A. [P est le type du paramètre formel, et A le type du
paramètre réel].
Type deduction is done independantly for each P/A pair, and the
deduced template argument values are then combined. If type
decduction cannot be done for any P/A pair, or if for any pair
the deduction leads to more than one possible set of deduced
values, or if different pairs yield different deduced values, or
if any template argument remains neither deduced nor explicilty
specified, template argument deduction fails.
Ce qui n'est pas particulièrement clair.
Il y a bien deux analyses distinctes : la déduction des types,
et la résolution des surcharges.
Franck Branjonneau wrote:"kanze" écrivait:Franck Branjonneau wrote:Yoxoman écrivait:La solution avec transform serait quelque chose du
genre :
typedef std::ctype< char >
Cvt ;
std::transform(
source.begin(), source.end(),
std::back_inserter( dest ),
std::bind1st(
std::mem_fun(
static_cast< char (Cvt::*)( char ) const >(
&Cvt::tolower ) ),
&std::use_facet< Cvt >( std::locale() ) ) ) ;
Sans oublier d'initialiser le locale global avant.
Ca me fait penser à un film : Scanners. Ca parle de gens
capables de faire exploser le cerveau d'autres presonnes
à distance.
Si c'est le static_cast<> qui t'ennuie, tu peux l'enelever.
Tu en es sûr ?
Je n'ai aucune certitude.Il y a bien deux fonctions std::ctype<>::tolower, selon la
norme. C'est vrai que la deuxième prend deux paramètres, et
qu'il n'y a aucune instantiation de std::mem_fun qui accepte
l'adresse d'une fonction à deux paramètres.
Oui mais ce ne sont pas des fonctions templates. Ce sont des
fonctions membres d'une classe template std::ctype<>. Qui,
elle, a été instanciée avec char, le compilateur doit donc
choisir entre les deux signatures
std::ctype< char >::tolower(char) const;
std::ctype< char >::tolower(char, const char) const;
pour choisir quelle std::mem_fun<> utiliser.
C'est juste, mais je ne crois pas que ça change grand chose.
Pour déterminer les paramètres d'instantiation de
std::mem_fun<>, on se sert de la déduction des types, qui elle
ne fonctionne (je crois) qu'avec un type connu. Or, pour
connaître le type ici, il faut de la résolution du surcharge.
Si j'ai bien compris la norme, la résolution du surcharge ne se fait
qu'une fois la déduction des types finie ; de toute façon, il a
besoin de l'instantiation pour faire la résolution du surcharge.
Mais tes commentaires m'ont amené a regardé dans la norme. En
fait, §14.8.2.2 dit bien que « Template arguments can be deduced
from the type specified when taking the address of an overloaded
function. »
, et dans §14.8.2.4 :
In some cases, tye deduction is done using a single set of types
P and A. [P est le type du paramètre formel, et A le type du
paramètre réel].
Type deduction is done independantly for each P/A pair, and the
deduced template argument values are then combined. If type
decduction cannot be done for any P/A pair, or if for any pair
the deduction leads to more than one possible set of deduced
values, or if different pairs yield different deduced values, or
if any template argument remains neither deduced nor explicilty
specified, template argument deduction fails.
Ce qui n'est pas particulièrement clair.
Il y a bien deux analyses distinctes : la déduction des types,
et la résolution des surcharges.
mais que developpez.com ne le connaisse pas, c'est plus embetant...
On est au courant au sujet de cette question, j'avais d'ailleurs demandé
ici des précisions:
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/4407df27f19258c0/60f5fb7adad7116d
J'en avais retenu:Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Et en suivant le fil de ce débat, on constate que c'est un sujet très
complexe en fait.
Sachant que notre public est francophone (je dis ça par rapport au
problème de l'allemand), et attend à une telle question une réponse
simple (c'est typiquement une demande pour un devoir d'étudiant), nous
avons estimé qu'il n'était pas nécessaire de rajouter un tel niveau de
complexité pour une question somme toute banale.
mais que developpez.com ne le connaisse pas, c'est plus embetant...
On est au courant au sujet de cette question, j'avais d'ailleurs demandé
ici des précisions:
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/4407df27f19258c0/60f5fb7adad7116d
J'en avais retenu:
Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Et en suivant le fil de ce débat, on constate que c'est un sujet très
complexe en fait.
Sachant que notre public est francophone (je dis ça par rapport au
problème de l'allemand), et attend à une telle question une réponse
simple (c'est typiquement une demande pour un devoir d'étudiant), nous
avons estimé qu'il n'était pas nécessaire de rajouter un tel niveau de
complexité pour une question somme toute banale.
mais que developpez.com ne le connaisse pas, c'est plus embetant...
On est au courant au sujet de cette question, j'avais d'ailleurs demandé
ici des précisions:
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/4407df27f19258c0/60f5fb7adad7116d
J'en avais retenu:Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Et en suivant le fil de ce débat, on constate que c'est un sujet très
complexe en fait.
Sachant que notre public est francophone (je dis ça par rapport au
problème de l'allemand), et attend à une telle question une réponse
simple (c'est typiquement une demande pour un devoir d'étudiant), nous
avons estimé qu'il n'était pas nécessaire de rajouter un tel niveau de
complexité pour une question somme toute banale.
mais que developpez.com ne le connaisse pas, c'est plus
embetant...
On est au courant au sujet de cette question, j'avais
d'ailleurs demandé ici des précisions:
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/4407d f27f19258c0/60f5fb7adad7116d
J'en avais retenu:Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Et en suivant le fil de ce débat, on constate que c'est un
sujet très complexe en fait.
Sachant que notre public est francophone (je dis ça par
rapport au problème de l'allemand), et attend à une telle
question une réponse simple (c'est typiquement une demande
pour un devoir d'étudiant), nous avons estimé qu'il n'était
pas nécessaire de rajouter un tel niveau de complexité pour
une question somme toute banale. Car comment résumer tout ce
qui a été dit en quelques lignes ? Ce sujet à lui tout seul
mériterait un article dédié...
L'enjeu est de savoir ce que ça rapporte par rapport à ce que
ça coûte, et nous avons pensé que ça apportait beaucoup de
confusion pour, en pratique, rien de mieux (cette solution
imparfaite fait la plupart du temps largement l'affaire).
En revanche, nous n'avons pas mentionné que cette solution est
loin d'être parfaite, et qu'elle ne peut pas être retenue si
l'on a des critères élevés de fiabilité. Nous en prenons note
et allons le préciser.
Pourquoi ? T'aurait-on fait croire que ce site contient des
informations valables ? J'ai nettement l'impression que
pour ce genre de site, l'important est d'avoir la plus
grande quantité possible de contenu. Du coup, aucune
vérification n'est effectuée.
Là je peux t'assurer que c'est faux.
mais que developpez.com ne le connaisse pas, c'est plus
embetant...
On est au courant au sujet de cette question, j'avais
d'ailleurs demandé ici des précisions:
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/4407d f27f19258c0/60f5fb7adad7116d
J'en avais retenu:
Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Et en suivant le fil de ce débat, on constate que c'est un
sujet très complexe en fait.
Sachant que notre public est francophone (je dis ça par
rapport au problème de l'allemand), et attend à une telle
question une réponse simple (c'est typiquement une demande
pour un devoir d'étudiant), nous avons estimé qu'il n'était
pas nécessaire de rajouter un tel niveau de complexité pour
une question somme toute banale. Car comment résumer tout ce
qui a été dit en quelques lignes ? Ce sujet à lui tout seul
mériterait un article dédié...
L'enjeu est de savoir ce que ça rapporte par rapport à ce que
ça coûte, et nous avons pensé que ça apportait beaucoup de
confusion pour, en pratique, rien de mieux (cette solution
imparfaite fait la plupart du temps largement l'affaire).
En revanche, nous n'avons pas mentionné que cette solution est
loin d'être parfaite, et qu'elle ne peut pas être retenue si
l'on a des critères élevés de fiabilité. Nous en prenons note
et allons le préciser.
Pourquoi ? T'aurait-on fait croire que ce site contient des
informations valables ? J'ai nettement l'impression que
pour ce genre de site, l'important est d'avoir la plus
grande quantité possible de contenu. Du coup, aucune
vérification n'est effectuée.
Là je peux t'assurer que c'est faux.
mais que developpez.com ne le connaisse pas, c'est plus
embetant...
On est au courant au sujet de cette question, j'avais
d'ailleurs demandé ici des précisions:
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/4407d f27f19258c0/60f5fb7adad7116d
J'en avais retenu:Voyons donc où on en est :
-- le code ne compile pas sur certains compilateurs (mais bien
sur d'autres),
-- ayant résolu ce problème, on tombe sur un cas de
comportement indéfini, et
-- ayant éliminé le comportement indéfini, il s'avère que le
résultat est faux.
Et en suivant le fil de ce débat, on constate que c'est un
sujet très complexe en fait.
Sachant que notre public est francophone (je dis ça par
rapport au problème de l'allemand), et attend à une telle
question une réponse simple (c'est typiquement une demande
pour un devoir d'étudiant), nous avons estimé qu'il n'était
pas nécessaire de rajouter un tel niveau de complexité pour
une question somme toute banale. Car comment résumer tout ce
qui a été dit en quelques lignes ? Ce sujet à lui tout seul
mériterait un article dédié...
L'enjeu est de savoir ce que ça rapporte par rapport à ce que
ça coûte, et nous avons pensé que ça apportait beaucoup de
confusion pour, en pratique, rien de mieux (cette solution
imparfaite fait la plupart du temps largement l'affaire).
En revanche, nous n'avons pas mentionné que cette solution est
loin d'être parfaite, et qu'elle ne peut pas être retenue si
l'on a des critères élevés de fiabilité. Nous en prenons note
et allons le préciser.
Pourquoi ? T'aurait-on fait croire que ce site contient des
informations valables ? J'ai nettement l'impression que
pour ce genre de site, l'important est d'avoir la plus
grande quantité possible de contenu. Du coup, aucune
vérification n'est effectuée.
Là je peux t'assurer que c'est faux.
Je ferai plutôt une distinction entre 2 types de public : ceux qui
veulent une solution rapide à leur problème, et les curieux qui veulent
une explication.
Donc y'a un impératif de concision de code. Pour être totalement
honnête, dans ce cas précis, je suis réticent à publier un code tel que
l'a posté James:
car cela fait très peur déjà, et je ne veux pas que ça alimente des
opinions / trolls sur "le c++ c'est horrible".
Alors
je me vois mal donner tout ça comme équivalent à strtoupper().
Je ferai plutôt une distinction entre 2 types de public : ceux qui
veulent une solution rapide à leur problème, et les curieux qui veulent
une explication.
Donc y'a un impératif de concision de code. Pour être totalement
honnête, dans ce cas précis, je suis réticent à publier un code tel que
l'a posté James:
car cela fait très peur déjà, et je ne veux pas que ça alimente des
opinions / trolls sur "le c++ c'est horrible".
Alors
je me vois mal donner tout ça comme équivalent à strtoupper().
Je ferai plutôt une distinction entre 2 types de public : ceux qui
veulent une solution rapide à leur problème, et les curieux qui veulent
une explication.
Donc y'a un impératif de concision de code. Pour être totalement
honnête, dans ce cas précis, je suis réticent à publier un code tel que
l'a posté James:
car cela fait très peur déjà, et je ne veux pas que ça alimente des
opinions / trolls sur "le c++ c'est horrible".
Alors
je me vois mal donner tout ça comme équivalent à strtoupper().
James et moi sommes en désaccord sur ce point.
Lui veut impérativement utiliser les algorithmes de la STL
quoi qu'il arrive ; moi je suis plus favorable à l'utilisation
d'une boucle for() quand ça simplifie le code.
James et moi sommes en désaccord sur ce point.
Lui veut impérativement utiliser les algorithmes de la STL
quoi qu'il arrive ; moi je suis plus favorable à l'utilisation
d'une boucle for() quand ça simplifie le code.
James et moi sommes en désaccord sur ce point.
Lui veut impérativement utiliser les algorithmes de la STL
quoi qu'il arrive ; moi je suis plus favorable à l'utilisation
d'une boucle for() quand ça simplifie le code.
Ce qu'il faudrait au minimum (parce que je comprends bien que tu
n'as pas envie d'y introduire les locale et al.), c'est :
1. Inclure <ctype.h> (ou <cctype>, si tu préfères), et ôter le
commentaire qu'il est inclut par <string> (qui est un aléa
de l'implémentation, et qui risque d'être avec la plupart
des implémentations, y compris la prochaine version du
compilateur que tu utilises de référence).
2. Écrire un petit classe fonctionnelle qui l'utilise :
struct ToLower
{
char operator()( char ch ) const
{
return tolower( static_cast< unsigned char >( ch) ) ;
// ou std::tolower, si tu inclus <cctype>...
}
} ;
Utilise un objet de cette classe dans le transform :
std::transform( ..., ToLower() ) ;
Ce qu'il faudrait au minimum (parce que je comprends bien que tu
n'as pas envie d'y introduire les locale et al.), c'est :
1. Inclure <ctype.h> (ou <cctype>, si tu préfères), et ôter le
commentaire qu'il est inclut par <string> (qui est un aléa
de l'implémentation, et qui risque d'être avec la plupart
des implémentations, y compris la prochaine version du
compilateur que tu utilises de référence).
2. Écrire un petit classe fonctionnelle qui l'utilise :
struct ToLower
{
char operator()( char ch ) const
{
return tolower( static_cast< unsigned char >( ch) ) ;
// ou std::tolower, si tu inclus <cctype>...
}
} ;
Utilise un objet de cette classe dans le transform :
std::transform( ..., ToLower() ) ;
Ce qu'il faudrait au minimum (parce que je comprends bien que tu
n'as pas envie d'y introduire les locale et al.), c'est :
1. Inclure <ctype.h> (ou <cctype>, si tu préfères), et ôter le
commentaire qu'il est inclut par <string> (qui est un aléa
de l'implémentation, et qui risque d'être avec la plupart
des implémentations, y compris la prochaine version du
compilateur que tu utilises de référence).
2. Écrire un petit classe fonctionnelle qui l'utilise :
struct ToLower
{
char operator()( char ch ) const
{
return tolower( static_cast< unsigned char >( ch) ) ;
// ou std::tolower, si tu inclus <cctype>...
}
} ;
Utilise un objet de cette classe dans le transform :
std::transform( ..., ToLower() ) ;