1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mars 2015
    Messages : 75
    Points : 59
    Points
    59

    Par défaut problème de conversion et concaténation des chaines de caractères

    Bonjour tout le monde,

    J'ai besoin de vos aides SVP.

    Je suis entrain de créer un programme qui reçoit ne entrée un nombre hexadécimal. Le but du programme est de vérifier si ce nombre est écrit sur 8 octets. Sinon il ajoute les zéros manquants au début.

    Par exemple: de : AFF12 je veux obtenir 000AFF12.

    J'ai commencé par convertir mon nombre en chaine pour déterminer le nombre de caractère et savoir combien de 0 je dois ajouter, et concaténer ensuite cette suite de 0 à la chaine de base.
    J'ai crée ce programme mais il plante donc surement il y a une erreur que je n'arrive pas à trouver.

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
     
    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    int main()
    {
        int c;
        char *chaine[10] ;
        int c_res;
        unsigned int c_long;
        char *chaine_zero;
        char *chaine_res;
        printf("donner le nombre: \n");
        scanf("%x", &c); 
     
        itoa(c,chaine,16);
        printf("la chaine obtenu est : %s \n", chaine);
     
        c_long=strlen(chaine);
        printf("la longeur est : %d \n", c_long);
     
     
        if(c_long==8)
        {
            c_res=c;
            printf("le  nombre = %x \n", c_res);
     
        }
         else
         {
             unsigned int nbre_zero=(8-c_long);
             printf("nbre_zero= %d \n", nbre_zero);
             switch(nbre_zero)
             {
                 case 1:
                     chaine_zero="0";
                     break;
                 case 2:
                     chaine_zero="00";
                     break;
                 case 3:
                     chaine_zero="000";
                     break;
                 case 4:
                     chaine_zero="0000";
                     break;
                case 5:
                    chaine_zero="00000";
                    break;
                case 6:
                    chaine_zero="000000";
                    break;
                case 7:
                    chaine_zero="0000000";
                    break;
         }
         printf("chaine_zero= %s \n", chaine_zero);
         concat(chaine_zero, nbre_zero, chaine, c_long,chaine_res);
         printf("chaine_res= %s \n", chaine_res);
         c_res=atoi(chaine_res);
         printf("le  nombre = %x \n", c_res);
         }
         return 0;
         }
     
     
       void concat(char * str1, unsigned int nbc1, char * str2, unsigned int nbc2,char * rstr)
    {
        unsigned int i = 0;
        rstr = (char*)malloc((nbc1+nbc2+1) * sizeof(char));
        for(i = 0; i < nbc1; i++)
            {
                rstr[i]=str1[i];
     
            }
     
     
        for(i = 0; i < nbc2; i++)
            {
                rstr[i+nbc1]=str2[i];
     
            }
     
     
        rstr[nbc1+nbc2+1]='\0';
     
    }
    Quelqu'un pourra m'aider SVP .
    Merci

  2. #2
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    mars 2009
    Messages
    547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2009
    Messages : 547
    Points : 1 624
    Points
    1 624

    Par défaut

    Quel est le but de cette "conversion" ? C'est juste pour faire de l'affichage ?
    Si c'est le cas, printf fait ça très bien tout seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("%08x", 1);
    --> 00000001

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 989
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 989
    Points : 16 645
    Points
    16 645

    Par défaut

    Et si tu utilisais les nombreuses options de configuration des fonctions *printf?

    Effectivement printf("%x", nombre) affiche le nombre brut en hexadécimal, mais en rajoutant les bonnes options entre le % et le x, tu peux obtenir ce que tu veux.
    Regarde une documentation officielle.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mars 2015
    Messages : 75
    Points : 59
    Points
    59

    Par défaut

    Citation Envoyé par nnovic Voir le message
    Quel est le but de cette "conversion" ? C'est juste pour faire de l'affichage ?
    Si c'est le cas, printf fait ça très bien tout seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("%08x", 1);
    --> 00000001
    Non je cherche à récupérer ce nombre par la suite pour le traiter. En fait, j'ai besoin qu'il soit sur 8octets car je vais extraire la partie LSB et MSB par le travail qui suit.

    Merci

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 596
    Points : 3 050
    Points
    3 050

    Par défaut

    Bonjour,

    réponse rapide en une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* buffer = malloc(8+1);
    sprintf( buffer , "%08X" , c ); // pour l'avoir dans une variable
    printf( "le  nombre = %s\n" , buffer );
    .

    Sinon dans ta version (un peu plus longue), ligne 87 il faut plutôt faire rstr[nbc1+nbc2]='\0';, et ne pas oublier de libérer la mémoire qui a été allouée au moment du concat.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    mars 2009
    Messages
    547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2009
    Messages : 547
    Points : 1 624
    Points
    1 624

    Par défaut

    Citation Envoyé par abyass Voir le message
    Non je cherche à récupérer ce nombre par la suite pour le traiter. En fait, j'ai besoin qu'il soit sur 8octets car je vais extraire la partie LSB et MSB par le travail qui suit.

    Merci
    Mais tu vas travailler sur des valeurs numériques ou sur des chaines de caractères ? Je pige pas, là !

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mars 2015
    Messages : 75
    Points : 59
    Points
    59

    Par défaut

    Citation Envoyé par nnovic Voir le message
    Mais tu vas travailler sur des valeurs numériques ou sur des chaines de caractères ? Je pige pas, là !
    effectivement je travaille avec valeurs numériques donc je dois convertir les chaines en entiers par la suite. Et c'est mon problème déjà là. Quand j'applique atoi le résultat revient sans les 0 ajoutés.
    Merci

  8. #8
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    mars 2009
    Messages
    547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2009
    Messages : 547
    Points : 1 624
    Points
    1 624

    Par défaut

    Dans ce cas il ne faut surtout pas chercher à passer par des chaines de caractères. Ton entier est dans la variable 'c', qui est de type int. Un simple jeu de masques et de décalages de bits te permettront d'isoler la partie 'haute' de la partie 'basse'. Les fameux zéros que tu veux ajouter sont une simple convention d'affichage, ça n'apporte rien à ton programme.

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mars 2015
    Messages : 75
    Points : 59
    Points
    59

    Par défaut

    Je vous explique en gros mon problème.

    Je suis entrain de récupérer des contenus des registres sur un port COM depuis carte. Ces registres contiennent des informations de tension, courant, puissance.. Les registres sont sur 8octets.
    En fait il y a des registres où l'information de courant est stocké dans les 17 bits de poids plus fort et la tension dans les 15bits plus faibles ( pas vraiment MSB(16 bits) et LSB(16bits)) donc je dois extraire ces deux parties à part pour les traiter par la suite.
    J'ai réalisé ça dans un tableau excel: STXT, .. et ça marche . Mais je n'arrive pas à traduire ces formules en C .

    Merci

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2007
    Messages
    4 989
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 4 989
    Points : 16 645
    Points
    16 645

    Par défaut

    Alors il faut utiliser un type adapté uint32_t pour un registre 32 bits (ca semble mieux correspondre à 15+17 que les 64bits de tes "8 octets"). Ce type est présent dans l'entête standard #include <stdint.h>.

    Une fois cela fait, il faut jongler avec les opérateurs bit-à-bit (bitwise).
    Par exemple, 0xFFFF8000 est un nombre dont les 17 bits de poids fort valent 1, et les 15 de poids faible valent 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef uint32_t registre_t;
     
    int get_intensity(registre_t registre) {
        registre_t const bitmask_17 = UINT_32C(0x1FFFF);
        return ((registre & (bitmask_17<<17) >> 17)) & bitmask_17;
    }
     
    int get_voltage(registre_t registre) {
        registre_t const bitmask_15 = UINT_32C(0x7FFF);
        return ((registre & (bitmask_15<<15)) >> 15) & bitmask_15;
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Membre expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 596
    Points : 3 050
    Points
    3 050

    Par défaut

    Bonjour,
    Pour récupérer deux données sur 17 et 15 bits, on peut utiliser les champs de bits et les union qui peuvent être anonymes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    union {
        uint32_t  valeur;        // valeur et la struct partagent le même espace
        struct {
            unsigned intensite : 17;     // 17 premiers bits sont intensite
            unsigned tension   : 15;     // 15 bits qui suivent sont tension
        };
    };
    valeur = c;  // on écrit dans l'union, et il ne reste qu'à lire les résultats
    printf("intensite = %d, tension = %d\n" , intensite , tension );
    On peut sinon créer une fonction qui extrait un nombre de bits à une position donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unsigned extraitBits( uint32_t val , unsigned bitsOffset , unsigned nbBits ) {
        return (val >> bitsOffset) & ((1u<<nbBits) - 1u);
    }
    unsigned lit_intensite( uint32_t val ) {
        return extraitBits( val , 15 , 17 );     // 17 bits à partir du bit15
    }
    unsigned lit_tension( uint32_t val ) {
        return extraitBits( val , 0 , 15 );      // 15 bits à partir du bit0
    }

  12. #12
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mars 2015
    Messages : 75
    Points : 59
    Points
    59

    Par défaut

    Merci pour votre réponse

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/01/2013, 21h15
  2. Réponses: 1
    Dernier message: 10/01/2008, 11h10
  3. Problème sur des chaines de caractères
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/10/2007, 14h11
  4. Problème dans des "IF" avec des chaines de caractères
    Par lanysteph dans le forum Fonctions
    Réponses: 4
    Dernier message: 16/11/2006, 12h37
  5. Problème de syntaxe pour concaténer des variables
    Par renaud26 dans le forum JavaScript
    Réponses: 3
    Dernier message: 05/09/2006, 10h44

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