OVH Cloud OVH Cloud

prog. et architectures

4 réponses
Avatar
Philippe LANGEVIN
Bonjour,


Dans un programme en langage c destiner a etre compile
sur des architectures differentes, j'utilise des entiers de 64 bits.

sous alpha : le type long suffit
sous linux : j'utilise long long.

Pour les affichages : il faut donc utiliser deux formats
differents %l et %Ld.

Quelles est la meilleure facon de gerer une source
commune aux deux architectures ?

PL

4 réponses

Avatar
rixed
Ce ne serait pasd plus simple de caster systématiquement en long long ?
printf("%Ldn", (long long)l_un_ou_l_autre);
Avatar
Serge Paccalin
Le samedi 28 juin 2003 à 09:09:54, rixed a écrit dans fr.comp.lang.c :

Ce ne serait pasd plus simple de caster systématiquement en long long ?
printf("%Ldn", (long long)l_un_ou_l_autre);


Caster, non. Il faut que les variables contiennent ces valeurs 64 bits.
Ce n'est pas en les castant après coup qu'on affichera les bits qu'on
n'a pas stockés...

Les déclarer en long long, peut-être, si tous les compilateurs concernés
le connaissent.

--
___________ 2003-06-29 09:34:42
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Avatar
Philippe LANGEVIN

Le lundi 23 juin 2003 à 11:37, Philippe LANGEVIN a écrit dans
fr.comp.lang.c :

Dans un programme en langage c destiner a etre compile
sur des architectures differentes, j'utilise des entiers de 64 bits.

sous alpha : le type long suffit
sous linux : j'utilise long long.

Pour les affichages : il faut donc utiliser deux formats
differents %l et %Ld.

Quelles est la meilleure facon de gerer une source
commune aux deux architectures ?


#define/#ifdef, je pense.

#if defined(__linux__) /* à déterminer... */

typedef long long INT64;
#define FMT_I64 "Ld"

#elif defined(__alpha__) /* à déterminer... */

typedef long INT64;
#define FMT_I64 "ld"

#else

#error entiers 64 bits non supportés

#endif

...

INT64 n = 123456789;
n *= 987654321;

printf("n vaut %10" FMT_I64 "n",n);

J'ai mis __linux__ et __alpha__ au pif. Il faut que tu regardes quelles
macros sont définies par tes compilateurs spécifiquement à tes
environnements.



Ok, c'est je ne connaissais pas cette possibilite de concatenation
au niveau des chaines de caracteres, la syntaxe reste assez legere.

Juste un petit point encore...
comment faire la liste des macros definies par le compilateur ?


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Philippe LANGEVIN wrote:

Juste un petit point encore...
comment faire la liste des macros definies par le compilateur ?


Par définition, ça dépend entièremement du compilateur. Je ne connais pas
d'autre moyen que de lire en détails la doc du compilateur.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/