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 :

conversion tableau de char en integer(split)


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Par défaut conversion tableau de char en integer(split)
    bonjour, je travail depuis quelque temps avec un pic, je recois des données via le port serie qui est une trame avec 11 digit, le premier est ':' qui me permet de détecté ma trame.
    la séquence de chiffre que je recois vas dans un char buffer[11].
    les test fonctionne a merveille je recois bien les chiffres. mais le probleme ce pose je voudrais découpé mon char en 5 découpe. donc 2 digit a chaque fois et les placé dans 5 variable distinc qui sont en integer...

    exemple:
    trame ":1234567890"

    j'essaye d'avoir

    int a=12;
    int b=34;
    int c=56;
    int d=78;
    int e=90;

    j'essyé la fonction atoi mes il me renvoie zero. si quelqu'un a une methode..et je comprend comment faire mes découpe...la trame que je recois est toujours de longueur 11


    merci d'avance....

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Par défaut
    Même réponse :
    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
     
    int transforme(char a,char b)
    {
      int resultat = 0;
      if(a=='0')
        resultat+=0;
      if(a=='1')
       resultat+=10;
      //...
      if(a=='9')
       resultat+=90;
     
      if(b=='0')
        resultat+=0;
      if(b=='1')
       resultat+=1;
      //...
      if(b=='9')
       resultat+=9;
     
      return resultat; 
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Par défaut
    il y a pas plus simple, j'ai déjà trouvé le moyen de recuperer mes variables indépédament via

    eclair1 = strtol(buffer[3], NULL, 10);
    eclair2= strtol(buffer[4], NULL, 10);
    donc il reste plus qu'as concaténé

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(buffer,":%2d%2d%2d%2d%2d", &a,&b,&c,&d,&e);

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Par défaut
    merci, mais je genere une erreur, mon stdio.h utilise des fonction assez restrain juste le printf.
    meme si je met stdio.h j'ai des erreur parce que le pic ne sais pas tout utilisé...il y a pas une autre methode...je sais j'ennuie mon monde...surtout en java...il y a plus de choix....mais je suis obligé d'utilisé le c

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par droiter Voir le message
    merci, mais je genere une erreur, mon stdio.h utilise des fonction assez restrain juste le printf.
    meme si je met stdio.h j'ai des erreur parce que le pic ne sais pas tout utilisé...il y a pas une autre methode...je sais j'ennuie mon monde...surtout en java...il y a plus de choix....mais je suis obligé d'utilisé le c
    Java sur PIC, mais bien sûr...

    Le principe est de lire 2 caratères, d'en faire une chaine, de les convertir en une valeur numérique et ainsi de suite. C'est un peu ce que fait strtol(), mais sur une largeur fixe. Je propose ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long str_tol_fixed (char const *s, int width, char **pp_end, int base);
    qui s'utilise comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int main (void)
    {
       char trame[] = ":1234567890";
       char *p_end = trame + 1;
     
       /* attention, si la trame est erronee : boucle infinie ! */
       while (*p_end != 0)
       {
          int n = str_tol_fixed (p_end, 2, &p_end, 10);
          printf ("n = %d\n", n);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    n = 12
    n = 34
    n = 56
    n = 78
    n = 90
     
    Process returned 0 (0x0)   execution time : 0.039 s
    Press any key to continue.
    Tu sauras la coder ?

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <stdio.h>
    #include <stdlib.h>
    #include <strings.h>
    
    long str_tol_fixed (char const *s, int width, char **pp_end, int base)
    {
       long n = 0;
       /* allocation de la sous-chaine */
       char *sub = malloc (width + 1);
       if (sub != NULL)
       {
          int i;
          /* initialisation de la sous chaine */
          for (i = 0; i < width; i++)
          {
             sub[i] = s[i];
          }
          sub[i] = 0;
    
          /* conversion standard */
          {
             char *pend_sub;
             long val = strtol (sub, &pend_sub, base);
    
             /* verification */
             if (*pend_sub == 0)
             {
                if (pp_end != NULL)
                {
                   (*pp_end) += width;
                }
                n = val;
             }
             else
             {
                /* en cas d'erreur, on s'arrete a la premiere conversion fausse */
                if (pp_end != NULL)
                {
                   (*pp_end) += (pend_sub - sub);
                }
             }
          }
          free (sub);
       }
       return n;
    }

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 962
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 962
    Par défaut
    Voe,
    Citation Envoyé par zehle Voir le message
    Même réponse :
    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
     
    int transforme(char a,char b)
    {
      int resultat = 0;
      if(a=='0')
        resultat+=0;
      if(a=='1')
       resultat+=10;
      //...
      if(a=='9')
       resultat+=90;
     
      if(b=='0')
        resultat+=0;
      if(b=='1')
       resultat+=1;
      //...
      if(b=='9')
       resultat+=9;
     
      return resultat; 
    }
    Au moins, voilà qui est bien bourrin !

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 12
    Par défaut
    j'ai trouvé plus simple, au lieux de ramené la trame en char[], j'ai fait un tableau integer...pour chaque case que j'avais c'était en ascii.
    alors j'ai fait
    temp=trame[2]-48;//le code ascii 48 renvoie zero donc ca affecte pas ma valeur final
    temp=temp*10;//je met le nombre à la dizaine
    final=trame[3]-48;
    final=final+temp;

    je repete l'opération 5 fois
    voila si quelqu'un à le meme probleme....

    ps: quand je parlais de java, ces concernant le traitement des chiffres qui est plus facile je trouve...je sais bien que le pic ce programme pas en java, ces juste du c ou de l'asembleur, d'ailleurs au final ces des 0 ou des 1...

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par droiter Voir le message
    j'ai trouvé plus simple, au lieux de ramené la trame en char[], j'ai fait un tableau integer...pour chaque case que j'avais c'était en ascii.
    alors j'ai fait
    temp=trame[2]-48;//le code ascii 48 renvoie zero donc ca affecte pas ma valeur final
    temp=temp*10;//je met le nombre à la dizaine
    final=trame[3]-48;
    final=final+temp;

    je repete l'opération 5 fois
    voila si quelqu'un à le meme probleme....
    Oui c'est certainement plus simple et plus rapide, mais hautement spécialisé.

    Au fait, tu es certain que les nombres sont représentés en décimal ? Les trames :xxyy.. sont généralement des séquences d'octets codées en hexa... (format Intelhex)

    http://en.wikipedia.org/wiki/.hex

    Si c'est le cas, dans mon code, on remplace 10 par 16 (base).

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/04/2009, 17h46
  2. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 11h51
  3. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02
  4. Réponses: 4
    Dernier message: 10/10/2003, 18h04
  5. "Conversion" d'un char en int ou longueur
    Par Michaël dans le forum C
    Réponses: 6
    Dernier message: 15/08/2003, 11h40

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