IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Afficher un double avec que des ints (fct sprintf)


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 41
    Points
    41
    Par défaut Afficher un double avec que des ints (fct sprintf)
    Bonjour à tous,
    je programme en C sur un micro-contrôleur. Mon souci, c'est qu'il n'y a pas de bibliothèque pour afficher des variables via liaison série. Du coup, je suis obligé d'utiliser la fonction sprintf et de mettre ça dans un buffer, puis d'envoyer le buffer via la liaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sprintf(buf, "%d\n\r",ma_variable) ;
    UART_1_PutString(buf);
    Mon souci, c'est que je voudrais afficher une variable de type double à virgule, sauf que la fonction sprintf fonctionne qu'avec des int. Je me suis dit pas pas problème j'affiche ma variable castée en int puis, ensuite, j'affiche ma variable moins ma variable castée en int pour récupérer l’après virgule, puis je la multiplie par 100:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double Var;
    sprintf(buf, "%d\t%d\n\r",(int)Var,((Var-(int)Var)*100)) ;
    UART_1_PutString(buf);
    Mais je ne comprends pas : ça ne marche, quand j'ai un nombre négatif j'obtiens deux nombres négatif du style -5,-7
    Or, si j'essaye ma technique avec un nombre négatif ça marche :
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Var=-56,78
    (abs(-56,78-(-56)))*100
    Mais quand je le programme ça ne marche pas ça renvoie 0 :

    Mon code, errPitch est un double, et vir c'est mon int qui contient les nombres après la virgule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vir=(int)(abs(errPitch-((int)errPitch)))*100;
        sprintf(buf, "%d,%d\n\r",(int)errPitch,vir ) ;
        UART_1_PutString(buf);
    Merci les gars.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonsoir,

    Lorsque tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Var-(int)Var)*100)) ;
    … l'expression entière va être promue en double. Donc, le paramètre passé à ton sprintf() ne sera pas du bon format.

    Mais peu importe : printf() et sprintf() savent très bien manipuler les double (et heureusement). Il te suffit d'utiliser « %f » à la place de « %d ».

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 61
    Points : 41
    Points
    41
    Par défaut
    l'expression entière va être promue en double. Donc, le paramètre passé à ton sprintf() ne sera pas du bon format.
    c'est pour ca que je le recast en INT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vir=(int)(abs(errPitch-((int)errPitch)))*100;
        sprintf(buf, "%d,%d\n\r",(int)errPitch,vir ) ;
        UART_1_PutString(buf);
    Mais peu importe : printf() et sprintf() savent très bien manipuler les double (et heureusement). Il te suffit d'utiliser « %f » à la place de « %d ».
    non justement, quand je met un %f l'UART ne l'envoi pas et je recois rien sur la liaison, je dois passer par des %d

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu peux aussi essayer (int)(errPitch*100)%100, je pense.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    C'est curieux que sprintf() ne gère pas correctement « %f ». Ce n'est pas impossible sur une architecture limitée comme un micro-contrôleur, mais ça reste improbable.

    Si elle est disponible sur ta plateforme, je te suggère d'utiliser floor() pour récupérer la partie entière d'un flottant, de faire le calcul dans le format d'origine, et de ne faire le cast qu'au moment de l'affichage.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 48
    Points
    48
    Par défaut
    j'ignore si c'est le même processeur mais une petite recherche google m'a fait tombé sur ce fichier: https://code.google.com/p/gtsolarjac..._RS485.c?r=391
    et l'on voit qu'il a une fonction doubletoasciihex (qui ne m'a pas l'air spécialement correcte d'ailleurs...au vu de http://linux.die.net/man/3/snprintf ce serait plutot %04A ?))
    Ne peux-tu t'en inspirer pour transmettre la représentation ascci de ton double (en supposant une compatibilité du double entre ton processeur et celui de ton pc!)?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par Sasuke1234 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double Var;
    sprintf(buf, "%d\t%d\n\r",(int)Var,((Var-(int)Var)*100)) ;
    UART_1_PutString(buf);
    Mais je ne comprends pas : ça ne marche, quand j'ai un nombre négatif j'obtiens deux nombres négatif du style -5,-7
    Si Var = -5.07...

    -5.07 - (int)(-5.07) = -5.07 -(-5) = -0.07...
    donc -0.07 * 100 = -7...
    Peut-être aurais-tu dû mettre un abs() autour de l'expression ?

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    C'est curieux que sprintf() ne gère pas correctement « %f ». Ce n'est pas impossible sur une architecture limitée comme un micro-contrôleur, mais ça reste improbable.
    C'est tout à fait probable. Pour alléger les tailles de code, les compilateurs ont des "options" pour avoir des bibliothèques standards plus ou moins completes et justement les formateurs de printf() font partie des morceaux amovibles. Il faut regarder les options du compilateur, pour savoir s'il est possible de rajouter %f.

    Citation Envoyé par Obsidian Voir le message
    Si elle est disponible sur ta plateforme, je te suggère d'utiliser floor() pour récupérer la partie entière d'un flottant, de faire le calcul dans le format d'origine, et de ne faire le cast qu'au moment de l'affichage.
    Pour avoir une idée de la valeur d'un nombre, floor() semble une bonne solution.

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/03/2014, 07h26
  2. Afficher un colone avec uniquement des boutons
    Par nayzi dans le forum Débuter
    Réponses: 2
    Dernier message: 11/09/2012, 18h56
  3. Afficher un double avec 2 chiffres après la virgule
    Par luilui dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 08/12/2010, 18h19
  4. Réponses: 1
    Dernier message: 10/06/2008, 22h04
  5. Que des problèmes avec vi
    Par meufeu dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 20/07/2004, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo