Forum Programmation.c compilation distante : problème avec les litéraux flottants

Posté par  .
Étiquettes : aucune
0
13
oct.
2006
Voici mon programme c.c
#include <stdio.h>
void main() {
float f;
double d;
f = 0.5;
printf("f=%f\n", f);
f = (float)0.5;
printf("0.5=%f\n", 0.5);
printf("0.5f=%f\n", 0.5f);
printf("0.9=%f\n", 0.9);
printf("1.9=%f\n", 1.9);
d = 0.5;
printf("d0.5=%f\n", d);
printf("1.0/2.0=%f\n", 1.0 / 2.0);
}

Je le compile sur H-UX 11.11 et je l'exécute :
#/usr/bin/cc c.c
#a.out
f=0.500000
0.5=0.500000
0.5f=0.500000
0.9=0.900000
1.9=1.900000
d0.5=0.500000
1.0/2.0=0.500000

Jusqu'à la tout va bien.

Je le compile à distance depuis une machine Solaris :
solaris#rsh machineHP /usr/bin/cc c.c

et je l'execute sur HP :
#a.out
f=0.000000
0.5=0.000000
0.5f=0.000000
0.9=0.000000
1.9=1.000000
d0.5=0.000000
1.0/2.0=0.500000
Et là, c'est la catastrophe. Tous les litéraux flottant sont arrondis à l'entier inférieur. Les bras m'en tombent.

Comment est-ce possible ?
  • # il me semble que par défaut

    Posté par  . Évalué à 3.

    les flotants sont des doubles,
    donc %lf pour les printf
    mais bon j'ai rien pour tester sous la main alors t'as plus qu'a essayer ( ou alors cast en float

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: il me semble que par défaut

      Posté par  . Évalué à 1.

      J'ai testé avec %lf, ça ne change rien.
      • [^] # Re: il me semble que par défaut

        Posté par  . Évalué à 3.

        oups je me suis trompé de sens :/
        en fait %f attend un double :P

        donc %hf je crois ou alors défini tes constante en double :)

        man printf ^^

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: il me semble que par défaut

          Posté par  . Évalué à 1.

          C'est le cas dans mon 2ieme printf. 0.5 est un double.
          • [^] # Re: il me semble que par défaut

            Posté par  . Évalué à 2.

            est ce que tu pourrais compiler avec -Wall, et nous donner les warnings ?

            :)

            Il ne faut pas décorner les boeufs avant d'avoir semé le vent

            • [^] # Re: il me semble que par défaut

              Posté par  . Évalué à 1.

              C'est pas gcc, je n'ai pas -Wall. Mais j'ai cela

              rsh sir01hp /usr/bin/cc +w1 c.c
              cc: warning 486: The default compilation mode, -Ae (ANSI), is being used. This default has changed from -Ac (K&R C).
              cc: warning 474: By default 'const' qualified objects are now stored in literal space using +ESconstlit. This may lead to run-time errors if the semantics of 'const' are violated.



              Le code ne compile pas ave -Ac.
              Et même, si je le modifie pour que ça compile, ca ne fonctionne toujours pas.
        • [^] # Re: il me semble que par défaut

          Posté par  . Évalué à 1.

          Pas la peine de définir ses constantes en double: en l'absence de prototype, les valeurs des arguments de type float sont convertis en valeurs de type double avant l'appel d'une fonction. Reste que printf() est définie avec un type variable, donc j'ai un doute sur le statut exact. Reste que, à 99% de chances, la conversion des arguments float en double est effectuée.
          Pour les autres cas, dans son code, les constantes 0.5 et autres sont de type double, donc le produit aussi, donc il n'y a aucun problème de typage dans son code (à part le fait que main renvoie un int).
  • # Compilation sur Solaris, execution sur HP-UX???

    Posté par  . Évalué à -1.

    Si j'ai bien compris tu compiles sur Solaris, et tu execute sur HP-UX, et tu t'attends à ce que ca marche. Je sais même pas si ce sont les mêmes architectures de processeur.

    Tu as même de la chance d'avoir autre chose que SEGFAULT.....
    • [^] # Re: Compilation sur Solaris, execution sur HP-UX???

      Posté par  . Évalué à 1.

      Tu as mal compris.
      Je compile et execute sur HP.

      Dans le dernier cas, j'ai juste déclenché la compilation HP depuis une machine Solaris.

      J'imagine que cela a une influence sur l'environnement de la compilation, mais de la à transformer 0.5 en 0 ....
  • # La réponse

    Posté par  . Évalué à 0.

    J'ai fini par trouvé la solution (même si je ne comprends pas tout ):

    solaris# rsh machineHP "setenv LANG C ; /usr/bin/cc c.c"

    fonctionne !

    Il manquant "setenv LANG C".

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.