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 :

Décortiquer un unsigned char


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Par défaut Décortiquer un unsigned char
    Bonjour,

    Voici un petit problème certainement simple pour certains, mais difficile pour moi.

    Je dois décomposer un unsigned char, afin de pouvoir l'envoyer dans une file FIFO de 16 bits.


    Je m'explique :
    Soit le type U8 (unsigned char de 8 bits défini en printf précédemment).

    Soit le nombre suivant : U8 nb_pommes = 132;
    ou encore U8 nb_pommes = 0x84;


    Et le tableau suivant : U8 buffer[15]; (tableau d'unsigned char de 8bits)

    Mon but est de réaliser une fonction permettant de décomposer la valeur de nb_pommes : unité, dizaines, centaines... afin de les placer comme ceci
    U8 buffer[0] = 1;
    U8 buffer[1] = 3;
    U8 buffer[2] = 2;

    Voilà, j'ai un peu des soucis en ce qui concerne les types, les conversions en hexa etc...


    Ma première idée est avec les modulo et les divisions par 10.
    Cependant, l'inconvénient de cette méthode :

    void arranger_pommes(U8 nb_pommes)
    {
    u8 temp = 0;
    u8 compteur = 0;
    while(nb_pommes > 9)
    {
    temp = nb_pommes % 10; // on récupère les unités
    buffer[compteur] = temp;
    compteur ++;
    nb_pommes = nb_pommes/10; // on essaie de virer les unités
    }
    }

    Voilà, outre le fait que ca n'a pas l'air de bien marcher (132/10 = 13.2 et on tomberait sur un nombre a virgule... ptetre que ca passe vu le type u8), cette méthode à l'inconvénient de placer mes éléments dans le mauvais ordre.

    On obtiendrait :
    U8 buffer[0] = 2; au lieu de 1
    U8 buffer[1] = 3;
    U8 buffer[2] = 1; au lieu de 2
    Il faudrait alors réinver les éléments du tableau.

    Quelqu'un a t'il une meilleure méthode ?

    Pour info, cette fonction me sert a envoyer des données vers un HyperTerminal via une UART et donc de faire l'équivalent d'un print.
    J'ai donc très peu de moyens de vérifier ce que je fais.

    Merci beaucoup

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Par défaut
    Salut !
    Pour ton problème pour enlever les unités proprement tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nb_pommes =( (nb_pommes-(temp))/10);
    Pour la pile inversée c'est quoi c'est une liste doublement chainée que tu as créée? Tu peux peut-être en créer une 2nd et tout remettre dedans
    tu as :
    U8 buffer1[0] = 2;
    U8 buffer1[1] = 3;
    U8 buffer1[2] = 1;
    tu crées un second buffer (buffer2 par exemple) et avec une boucle tu fais :
    buffer2[0]=buffer1[2];
    buffer2[1]=buffer1[1];
    ect...
    et HOP t'as dodgé le problème

  3. #3
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par xaviooo
    Pour info, cette fonction me sert a envoyer des données vers un HyperTerminal via une UART et donc de faire l'équivalent d'un print.
    J'ai donc très peu de moyens de vérifier ce que je fais.

    Merci beaucoup
    Si j'ai bien compris, tu souhaites afficher des données sur un terminal.
    Ce que je n'ai pas bien saisi, c'est pourquoi tu décomposes ton entier ?
    Ne serait-il pas plus simple de convertir ton entier en une chaine (avec sprintf par exemple) ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Par défaut
    J'ai des contraintes de taille de code, donc si je peux éviter d'utiliser des fonctions lourdes du type printf, je le ferai.
    J'ai également lu que lorsque l'on programme un microcontrôleur, c'était très moche d'utiliser <stdio.h>.

    Honnêtement, je ne sais pas combien de mémoire me coûtera la fonction sprintf.

    Pour plus d'explications :

    Les données passent par un buffer de transmission : U8 TxBuffer[];

    Ces données sont ensuite envoyées vers la file FIFO de l'UART.
    La fonction permettant de réaliser cette opération ressemble à ca :
    void UART_Senddata(Nom_UART, U8 data);

    Ensuite, l'envoie est géré par interruptions.

    Sinon, merci Ghost, ca me paraît déjà plus beau que ce que j'ai fait^^.

  5. #5
    Membre éclairé Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Par défaut
    Citation Envoyé par xaviooo
    J'ai également lu que lorsque l'on programme un microcontrôleur, c'était très moche d'utiliser <stdio.h>.
    J'aimerai bien voir où t'as ça ...

    Citation Envoyé par xaviooo
    Les données passent par un buffer de transmission : U8 TxBuffer[];

    Ces données sont ensuite envoyées vers la file FIFO de l'UART.
    La fonction permettant de réaliser cette opération ressemble à ca :
    void UART_Senddata(Nom_UART, U8 data);
    Tes données sont dans ton buffer, envoie-les ! Qu'est-ce que ça change qu'elle soit dans l'autre sens, tu commences par envoyer le dernier élément du tableau et c'est fait ... !

    D'ailleurs, comment tu ferais la différence entre 21 et 210 si tu avais des chiffre dans l'autre sens ... ?

  6. #6
    Membre éclairé Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Par défaut
    Citation Envoyé par xaviooo
    Voilà, outre le fait que ca n'a pas l'air de bien marcher (132/10 = 13.2 et on tomberait sur un nombre a virgule... ptetre que ca passe vu le type u8)
    T'as pas du essayer, parce qu'en C, le résultat d'une division de deux nombres entiers est un nombre entier !

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 12
    Par défaut
    Ok, je te tiens au courant

Discussions similaires

  1. unsigned char* to char*
    Par xela2000 dans le forum MFC
    Réponses: 4
    Dernier message: 20/11/2005, 16h07
  2. Réponses: 6
    Dernier message: 06/10/2005, 11h30
  3. Décalage de bit sur unsigned char [8]
    Par dboulange dans le forum C++
    Réponses: 14
    Dernier message: 26/07/2005, 14h10
  4. Réponses: 19
    Dernier message: 28/04/2005, 15h36
  5. char et unsigned char
    Par jobherzt dans le forum C++
    Réponses: 8
    Dernier message: 11/02/2005, 00h24

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