C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

comment intercepter les erreurs dans <math> ?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Marc G
Guest





PostPosted: Sun Nov 05, 2006 3:20 am    Post subject: comment intercepter les erreurs dans <math> ? Reply with quote



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(...)
Sad
Marc
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sun Nov 05, 2006 10:11 am    Post subject: Re: comment intercepter les erreurs dans <math> ? Reply with quote



"Marc G" <mgueguen (AT) metrica (DOT) fr> writes:

Quote:
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
Back to top
Marc G
Guest





PostPosted: Sun Nov 05, 2006 4:35 pm    Post subject: Re: comment intercepter les erreurs dans <math> ? Reply with quote



Quote:
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
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sun Nov 05, 2006 5:04 pm    Post subject: Re: comment intercepter les erreurs dans <math> ? Reply with quote

"Marc G" <mgueguen (AT) metrica (DOT) fr> writes:

Quote:
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.

Quote:
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.

Quote:
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...

De la même manière.

$ cat testexp.cc
#include <errno.h>
#include <stdio.h>
#include <math.h>

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
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Mon Nov 06, 2006 10:11 am    Post subject: Re: comment intercepter les erreurs dans <math> ? Reply with quote

"Marc G" <mgueguen (AT) metrica (DOT) fr> writes:

Quote:
errno = 0;
double x = exp(1.0);
perror("exp");
double y = exp(65536.0);
perror("exp");

Sous Win32, j'ai pas trouvé mieux que

FILE *f=freopen("output.err","a+",stderr);
std::ios_base::syn_with_stdio();
errno=0;
double x=std::exp(100000.0);
if (errno!=0) perror("exp");
errno=0;
fclose(f);

mais y-a-t-il un moyen de rediriger le flux vers autre chose qu'un fichier ?

Tu as strerror si tu veux le message. Tu en fais ce que tu veux
apres. Tu as aussi une serie de macro ERRxxx avec lesquelles comparer
errno.

A+

--
Jean-Marc
Back to top
Michel Decima
Guest





PostPosted: Mon Nov 06, 2006 10:11 am    Post subject: Re: comment intercepter les erreurs dans <math> ? Reply with quote

Marc G a écrit :
Quote:
errno = 0;
double x = exp(1.0);
perror("exp");
double y = exp(65536.0);
perror("exp");

Sous Win32, j'ai pas trouvé mieux que

FILE *f=freopen("output.err","a+",stderr);
std::ios_base::syn_with_stdio();
errno=0;
double x=std::exp(100000.0);
if (errno!=0) perror("exp");
errno=0;
fclose(f);

mais y-a-t-il un moyen de rediriger le flux vers autre chose qu'un fichier ?

perror() traduit le code d'erreur contenu dans errno en une
chaine de caractere et l'affiche sur la sortie standard. Tu
peux utiliser la fonction strerror() pour ecrire ta propre
version de perror() qui ecrira ou tu veux:

void qerror(char const* msg)
{
LOG << msg << ": " << strerror(errno);
}
Back to top
Marc G
Guest





PostPosted: Mon Nov 06, 2006 10:11 am    Post subject: Re: comment intercepter les erreurs dans <math> ? Reply with quote

Quote:
errno = 0;
double x = exp(1.0);
perror("exp");
double y = exp(65536.0);
perror("exp");

Sous Win32, j'ai pas trouvé mieux que

FILE *f=freopen("output.err","a+",stderr);
std::ios_base::syn_with_stdio();
errno=0;
double x=std::exp(100000.0);
if (errno!=0) perror("exp");
errno=0;
fclose(f);

mais y-a-t-il un moyen de rediriger le flux vers autre chose qu'un fichier ?
A +
Marc
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.