tout est dit dans l'objet ...
sous win32, je peux surcharger la fonction
int _matherr(struct _exception *a)
mais je cherche une solution standard et multi-plateformes...si elle existe
ex : je fais
std::log(-1.0)
comment j'intercepte l'erreur ?
chez moi, ça passe à travers un catch(...)
:-(
Marc
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jean-Marc Bourguet
"Marc G" writes:
tout est dit dans l'objet ... sous win32, je peux surcharger la fonction int _matherr(struct _exception *a) mais je cherche une solution standard et multi-plateformes...si elle existe
ex : je fais std::log(-1.0) comment j'intercepte l'erreur ? chez moi, ça passe à travers un catch(...)
La norme ne définit pas d'exception pour ces erreurs. En cas d'erreur de domaine ou d'impossibilité de représenter le résultat, errno est mis à une valeur non nulle (EDOM ou ERANGE)
errno = 0; x = log(-1.0); assert(errno != 0);
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
"Marc G" <mgueguen@metrica.fr> writes:
tout est dit dans l'objet ...
sous win32, je peux surcharger la fonction
int _matherr(struct _exception *a)
mais je cherche une solution standard et multi-plateformes...si elle existe
ex : je fais
std::log(-1.0)
comment j'intercepte l'erreur ?
chez moi, ça passe à travers un catch(...)
La norme ne définit pas d'exception pour ces erreurs. En cas d'erreur de
domaine ou d'impossibilité de représenter le résultat, errno est mis à une
valeur non nulle (EDOM ou ERANGE)
errno = 0;
x = log(-1.0);
assert(errno != 0);
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
tout est dit dans l'objet ... sous win32, je peux surcharger la fonction int _matherr(struct _exception *a) mais je cherche une solution standard et multi-plateformes...si elle existe
ex : je fais std::log(-1.0) comment j'intercepte l'erreur ? chez moi, ça passe à travers un catch(...)
La norme ne définit pas d'exception pour ces erreurs. En cas d'erreur de domaine ou d'impossibilité de représenter le résultat, errno est mis à une valeur non nulle (EDOM ou ERANGE)
errno = 0; x = log(-1.0); assert(errno != 0);
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Marc G
errno = 0; x = log(-1.0); assert(errno != 0); oui, mais errno, c'est une variable globale win32
et assert, ça marche en mode debug... pour log, c'est facile de vérifier que l'argument passé est >0 mais pour exp par exemple, comment savoir qu'on a dépassé la valeur max double... A + et bon week-end ! Marc
errno = 0;
x = log(-1.0);
assert(errno != 0);
oui, mais errno, c'est une variable globale win32
et assert, ça marche en mode debug...
pour log, c'est facile de vérifier que l'argument passé est >0
mais pour exp par exemple, comment savoir qu'on a dépassé la valeur max
double...
A + et bon week-end !
Marc
errno = 0; x = log(-1.0); assert(errno != 0); oui, mais errno, c'est une variable globale win32
et assert, ça marche en mode debug... pour log, c'est facile de vérifier que l'argument passé est >0 mais pour exp par exemple, comment savoir qu'on a dépassé la valeur max double... A + et bon week-end ! Marc
Jean-Marc Bourguet
"Marc G" writes:
errno = 0; x = log(-1.0); assert(errno != 0); oui, mais errno, c'est une variable globale win32
Non. errno n'a rien à voir avec win32.
C'est une macro qui s'étends en une lvalue modifiable.
et assert, ça marche en mode debug...
Il y a pas mal de gens qui laissent les assertions activées même en mode release...
Et naturellement, tu fais naturellement le test que tu veux. L'utilisation de errno était un moyen simple de signifier que log devait mettre dans errno une valeur non nulle dans ce cas.
pour log, c'est facile de vérifier que l'argument passé est >0 mais pour exp par exemple, comment savoir qu'on a dépassé la valeur max double...
int main() { errno = 0; double x = exp(1.0); perror("exp"); double y = exp(65536.0); perror("exp"); } $ como -o testexp testexp.cc -lm Comeau C/C++ 4.3.3 (Oct 24 2003 16:00:23) for RedHat_LINUX_INTEL_ELF Copyright 1988-2003 Comeau Computing. All rights reserved. MODE:strict errors C++
$ ./testexp exp: Success exp: Numerical result out of range
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
"Marc G" <mgueguen@metrica.fr> writes:
errno = 0;
x = log(-1.0);
assert(errno != 0);
oui, mais errno, c'est une variable globale win32
Non. errno n'a rien à voir avec win32.
C'est une macro qui s'étends en une lvalue modifiable.
et assert, ça marche en mode debug...
Il y a pas mal de gens qui laissent les assertions activées même en mode
release...
Et naturellement, tu fais naturellement le test que tu veux. L'utilisation
de errno était un moyen simple de signifier que log devait mettre dans
errno une valeur non nulle dans ce cas.
pour log, c'est facile de vérifier que l'argument passé est >0
mais pour exp par exemple, comment savoir qu'on a dépassé la valeur max
double...
int main()
{
errno = 0;
double x = exp(1.0);
perror("exp");
double y = exp(65536.0);
perror("exp");
}
$ como -o testexp testexp.cc -lm
Comeau C/C++ 4.3.3 (Oct 24 2003 16:00:23) for RedHat_LINUX_INTEL_ELF
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict errors C++
$ ./testexp
exp: Success
exp: Numerical result out of range
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
errno = 0; x = log(-1.0); assert(errno != 0); oui, mais errno, c'est une variable globale win32
Non. errno n'a rien à voir avec win32.
C'est une macro qui s'étends en une lvalue modifiable.
et assert, ça marche en mode debug...
Il y a pas mal de gens qui laissent les assertions activées même en mode release...
Et naturellement, tu fais naturellement le test que tu veux. L'utilisation de errno était un moyen simple de signifier que log devait mettre dans errno une valeur non nulle dans ce cas.
pour log, c'est facile de vérifier que l'argument passé est >0 mais pour exp par exemple, comment savoir qu'on a dépassé la valeur max double...
int main() { errno = 0; double x = exp(1.0); perror("exp"); double y = exp(65536.0); perror("exp"); } $ como -o testexp testexp.cc -lm Comeau C/C++ 4.3.3 (Oct 24 2003 16:00:23) for RedHat_LINUX_INTEL_ELF Copyright 1988-2003 Comeau Computing. All rights reserved. MODE:strict errors C++
$ ./testexp exp: Success exp: Numerical result out of range
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Jean-Marc Bourguet
"Marc G" writes:
errno = 0; double x = exp(1.0); perror("exp"); double y = exp(65536.0); perror("exp");