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

  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 049
    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 049
    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

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

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 584
    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?

  7. #7
    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
    Ce code vient du lien que fred1599 a posté au dessus.

    Je suppose qu'il est bon.

  8. #8
    Membre très actif

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

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 584
    Par défaut
    OK

    Arrêtons tous de réfléchir alors.

  9. #9
    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
    ptr prend la valeur de result, grâce à cette ligne:

    char* ptr = result;

    ptr est donc initialisé, ce qui explique ma réponse évasive à ta question, "Ce code fait quoi? ptr vaut quoi? si ptr est juste déclarer en tant que char * sans initialisation?", peu constructive à mon sens.


    Je voulais juste savoir si j'utilisais correctement la fonction qu'on m'avait gentiment proposé.

  10. #10
    Membre très actif

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

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 584
    Par défaut
    char* ptr = result = cX qui lui n'est pas initialisé.

  11. #11
    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
    D'accord, mais il y a quelque chose que je ne comprend pas : cX contiendra le résultat de la fonction, avant il n'a pas de valeur, pourquoi et comment dois-je l'initialiser ?

    Merci.

  12. #12
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Lorsque tu ecris char * cX;, tu definis un pointeur sur un char. La valeur pointée est "n'importe quoi". Donc la premiere chose que tu fais, c'est *ptr++ = ..., c'est a dire que tu ecris nulle part.

    Il faut que tu alloues la zone memoire dans laquelle tu vas ecrire avec malloc (ou calloc).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  13. #13
    Membre très actif

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

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 584
    Par défaut
    Soit un malloc, soit tu le déclare directement cX comme un tableau de char.
    Mais dans tous les cas il te faut savoir quelle taille tu veux pour ce tableau.

  14. #14
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Jérôme .G Voir le message
    Je suppose qu'il est bon.
    Tout ton probleme est la : on te donne gentiement un lien, et tu l'appliques sans chercher a le comprendre ni a le verifier, et encore moins a comprendre comment il faut l'utiliser.

    La premiere chose qui me choque dans ce code, c'est la declaration des variables au milieu du code.
    La seconde, c'est la non verification que "result" n'est pas NULL. Or comme tu fais ptr=result, puis *ptr++, si result est NULL, tu vas avoir des surprises.
    Et puis cette ligne *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)]; ....
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  15. #15
    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
    Comprendre ce code et comprendre comment l'utiliser est tout ce que je demande.

    J'ai testé le code vu que ça ne marchait pas, et posté mon code pour savoir si je l'utilisais bien.

    Si j'ai demandé de l'aide c'est parce que je ne suis pas capable de produire ce code moi-même, difficile alors d'avoir un regard critique.

    Maintenant que j'en sais en plus sur les pointeurs je pense pouvoir avancer.

    Merci pour vos réponses.

  16. #16
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Je pense que n'importe quel moteur de recherche avec "code source itoa" t'aurait donne une solution. Quoi qu'il en soit, ce n'est pas parce qu'un code est sur le net qu'il est bon -- ni qu'il est mauvais d'ailleurs.

    Avant de l'utiliser, essaie de comprendre le code, et de voir ce qu'il fait -- notamment la ligne *ptr++
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  17. #17
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    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 049
    Par défaut
    Il faut que tu alloues la zone memoire dans laquelle tu vas ecrire avec malloc (ou calloc).
    Tout est dit, d'ailleurs j'ai testé il est fonctionnel, sans fuite... Bref il est nickel !

    En donnant ce lien, je voulais surtout affirmer qu'une recherche rapide suffisait...

    La seconde, c'est la non verification que "result" n'est pas NULL. Or comme tu fais ptr=result, puis *ptr++, si result est NULL, tu vas avoir des surprises.
    Peut-être a-t-il considéré que cette vérification était faite au préalable (on peut limite en être sûr sinon en effet c'est une erreur)

    La premiere chose qui me choque dans ce code, c'est la declaration des variables au milieu du code.
    Arf, malheureusement ça ne me surprend plus

    Cette fonction n'aurait-elle pas un air de ressemblance avec strcpy par exemple ?

+ 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