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 :

Convertir en int en char "à la main"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Par défaut Convertir en int en char "à la main"
    Bonjour à tous,

    J'aurais besoin de convertir un signed long en tableau de caractères, mais sans aucune bibliothèque car je travaille sur de l'embarqué.

    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    my_itoa :

    - trouver le signe (+ ou -)
    - récupérer l'ordre de grandeur en base 10 de la valeur absolue (cpt = 0; tant que nombre > 0 faire un div 10 et cpt++)
    - allouer le nombre de cases + 1 (+1 si négatif) pour des char
    - faire des modulos, s'aligner sur le code ASCII de '0', écrire la valeur dans la case correspondante du tableau
    - ne pas oublier le '\0' à la fin...

    Et voili voilou !
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    1 minute de recherche et ... voilà !

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Par défaut
    Merci beaucoup pour ces réponses et la rapidité !

    Il ne me reste plus qu'à essayer tout ça.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 49
    Par défaut
    Malheureusement je n'arrive pas à utiliser la fonction.. Peut être que je ne l'appelle pas bien.

    J'ai un booléen qui m'indique que je rentre bien dans mon traitement 'TraitemensCommandes' mais après plus rien (la LED témoin de ma carte électronique s'arrête de clignoter donc plantage du programme) et bien sûr pas de point d'arrêt pour voir ce qui se déroule dans la fonction itoa.

    Ma fonction légèrement modifiée (value est un signed long et non plus un int) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    char * itoa_c ( signed long  value, char * result, int base )
    {                                                                                                                                                        
        // check that the base if valid                                                                                                                      
        if ( base < 2 || base > 36 ) {                                                                                                                       
             *result = '\0';                                                                                                                                  
             return result;                                                                                                                                   
        }                                                                                                                                                    
     
        char* ptr = result, *ptr1 = result, tmp_char;                                                                                                        
        int tmp_value;                                                                                                                                       
     
        do {                                                                                                                                                 
             tmp_value = value;                                                                                                                               
             value /= base;                                                                                                                                   
             *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];                             
        } while ( value );                                                                                                                                   
     
        // Apply negative sign                                                                                                                               
        if ( tmp_value < 0 )                                                                                                                                 
             *ptr++ = '-';                                                                                                                                    
             *ptr-- = '\0';                                                                                                                                       
     
        while ( ptr1 < ptr ) {                                                                                                                               
             tmp_char = *ptr;                                                                                                                                 
             *ptr-- = *ptr1;                                                                                                                                  
             *ptr1++ = tmp_char;                                                                                                                              
        }                                                                                                                                                    
     
        return result;                                                                                                                                       
    }
    L'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void TraitementCommandes ()
     {  
     	if (( cSerialCmd [0] == 'S' )&&( cSerialCmd [1] == 'T' ))	
    	{	
                    // Je suis sûr de passer la condition ci-dessus
    		cX = itoa_c( slX, cX, 10 );
    	}
     }
    slX contient à ce moment le nombre 50.
    cX est déclaré après les #include dans le .c :
    Merci d'avance.

  6. #6
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    591
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 591
    Par défaut
    cX est déclaré après les #include dans le .c :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char* ptr = result, *ptr1 = result, tmp_char;                                                                                                        
        int tmp_value;                                                                                                                                       
     
        do {                                                                                                                                                 
             tmp_value = value;                                                                                                                               
             value /= base;                                                                                                                                   
             *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];                             
        } while ( value );
    Ce code fait quoi? ptr vaut quoi? si ptr est juste déclaré en tant que char * sans initialisation?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. convertir un "int" en "char*"
    Par highlight dans le forum C
    Réponses: 9
    Dernier message: 19/10/2011, 14h54
  2. Convertir des "int" en "char"s
    Par gabier dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 06/04/2008, 00h39
  3. convertir un int en char
    Par Art19 dans le forum Delphi
    Réponses: 2
    Dernier message: 25/04/2007, 17h09
  4. Convertir un int en char
    Par heruwenli dans le forum C++
    Réponses: 3
    Dernier message: 06/02/2007, 13h41

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