OVH Cloud OVH Cloud

#define conditionnel

16 réponses
Avatar
ben_cal
Bonjour,

je travaille en ce moment sur une lib qui peut avoir 2 versions (une
float et une double suivant que REAL est defini a float ou a double).
J'aimerais maintenant que tous les #define EPSILON et autres prennent en
compte la valeur de REAL. Soit un truc du genre:

#if REAL == float
#define EPSILON = 1e-4
#else
#define EPSILON = 1e-6

Si qq1 parmi vous a une solution propre, merci d'avance.

Benoit

10 réponses

1 2
Avatar
Florent C.
ben_cal wrote:

Bonjour,

je travaille en ce moment sur une lib qui peut avoir 2 versions (une
float et une double suivant que REAL est defini a float ou a double).
J'aimerais maintenant que tous les #define EPSILON et autres prennent
en compte la valeur de REAL. Soit un truc du genre:

#if REAL == float
#define EPSILON = 1e-4
#else
#define EPSILON = 1e-6

Si qq1 parmi vous a une solution propre, merci d'avance.

Benoit

#define REAL_DOUBLE // commenter ou decommenter suivant ce que l'on veut

#ifdef REAL_DOUBLE
#define REAL double
#define EPSILON 1e-6 //pas sur pour la syntaxe
#else
#define REAL float
#define EPSILON 1e-4
#endif

pas sur pour la syntaxe des 1e-6 et 1e-4 (je n'ai jamais utilisé cette
syntaxe en tout cas) mais en tout cas le principe (celui des #ifdef /
#endif) y est

flure

Avatar
Marc Boyer
In article <4032368a$, ben_cal wrote:
Bonjour,

je travaille en ce moment sur une lib qui peut avoir 2 versions (une
float et une double suivant que REAL est defini a float ou a double).
J'aimerais maintenant que tous les #define EPSILON et autres prennent en
compte la valeur de REAL. Soit un truc du genre:

#if REAL == float
#define EPSILON = 1e-4
#else
#define EPSILON = 1e-6

Si qq1 parmi vous a une solution propre, merci d'avance.


La solution propre en C++ ce serait plutôt template
+ typedef.
Juste pour rire, compile un bout de ta librairie avec
des floats, modifie deux-trois trucs, passe en double
et fait un make ou équivalent.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Falk Tannhäuser
ben_cal wrote:
je travaille en ce moment sur une lib qui peut avoir 2 versions (une
float et une double suivant que REAL est defini a float ou a double).
J'aimerais maintenant que tous les #define EPSILON et autres prennent en
compte la valeur de REAL. Soit un truc du genre:

#if REAL == float
#define EPSILON = 1e-4
#else
#define EPSILON = 1e-6
#include <limits>


'std::numeric_limits<REAL>::epsilon()' te fournit la valeur d'epsilon
correspondante au type REAL (soit 'float', 'double' ou 'long double')
sur ta plate-forme.

Falk

Avatar
Loïc Joly
Falk Tannhäuser wrote:
ben_cal wrote:

je travaille en ce moment sur une lib qui peut avoir 2 versions (une
float et une double suivant que REAL est defini a float ou a double).
J'aimerais maintenant que tous les #define EPSILON et autres prennent en
compte la valeur de REAL. Soit un truc du genre:

#if REAL == float
#define EPSILON = 1e-4
#else
#define EPSILON = 1e-6


#include <limits>

'std::numeric_limits<REAL>::epsilon()' te fournit la valeur d'epsilon
correspondante au type REAL (soit 'float', 'double' ou 'long double')
sur ta plate-forme.


Et de plus, ça marche aussi si on a fait :

typedef Real double;

au lieu de

#define REAL double

--
Loïc


Avatar
Nicolas Aunai
Loïc Joly a formulé la demande :

Et de plus, ça marche aussi si on a fait :

typedef Real double;



euh...

typedef double Real;

plutôt..

A+

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Loïc Joly
Nicolas Aunai wrote:

Loïc Joly a formulé la demande :

Et de plus, ça marche aussi si on a fait :

typedef Real double;




euh...

typedef double Real;

plutôt..


Oups...

--
Loïc


Avatar
ben_cal
Loïc Joly wrote:

Et de plus, ça marche aussi si on a fait :

typedef Real double;

au lieu de

#define REAL double


Le probleme c que REAL n'est pas defini dans le code mais dans les
options du projet VC++. De cette maniere, on peut recompiler les libs
sans avoir a toucher le code.
Si on fait des trucs du genre, REAL est defini "qqpart" et je ne suis
pas sense savoir ou en fait. A moi de me debrouiller correctement pour
changer le code sans "gener" les autres...

Merci pour vos reponses,
Benoit

Avatar
ben_cal
ben_cal wrote:

Le probleme c que REAL n'est pas defini dans le code mais dans les
options du projet VC++. De cette maniere, on peut recompiler les libs
sans avoir a toucher le code.
Si on fait des trucs du genre, REAL est defini "qqpart" et je ne suis
pas sense savoir ou en fait. A moi de me debrouiller correctement pour
changer le code sans "gener" les autres...
Euh, il vous inspire tant que ca mon probleme? ;-(

Personne n'a jamais essaye de faire un truc pareil ou c juste parce que
ma question est toute pourrite??

Benoit

Avatar
Loïc Joly
ben_cal wrote:

ben_cal wrote:

Le probleme c que REAL n'est pas defini dans le code mais dans les
options du projet VC++. De cette maniere, on peut recompiler les libs
sans avoir a toucher le code.
Si on fait des trucs du genre, REAL est defini "qqpart" et je ne suis
pas sense savoir ou en fait. A moi de me debrouiller correctement pour
changer le code sans "gener" les autres...


Euh, il vous inspire tant que ca mon probleme? ;-(
Personne n'a jamais essaye de faire un truc pareil ou c juste parce que
ma question est toute pourrite??


Euh, il me semblait que tu avais déjà eu de bonnes solutions, qu'est-ce
qui ne te conviens pas avec ?

--
Loïc


Avatar
benoit le callennec
Loïc Joly wrote:


Euh, il me semblait que tu avais déjà eu de bonnes solutions, qu'est-ce
qui ne te conviens pas avec ?


A moins que j'ai rate un truc, mais les solutions proposees suppposent
que ce soit moi qui definisse REAL. Malheureusement ce n'est pas le cas
car il est defini dans les options de compilation...
Donc, je me retrouve avec un REAL deja defini et utilise partout dans le
code.
Pour resumer, on doit pouvoir recompiler toutes les libs uniquement en
ne changeant que cette option de compilation...
Ya t'il un truc que j'aurais manque?

Benoit

1 2