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 :

Problème de compréhension


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Par défaut Problème de compréhension
    Bonjour,

    Je suis débutant en C, et je voudrais comprendre ce code...
    Merci d'avance

    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
    void Chaine_convertirEntierEnChaine(char* dest, int valeur, int base) { 
       int digit;
     
       /* Allocation d'un tableau temporaire qui contiendra la chaîne résultat.
        * On la remplira en partant de la fin.
        * On positionne dont le pointeur ptr sur le dernier élément de ce tableau,
        * dans lequel on place le zéro de fin de chaîne.
        *
        * On alloue 33 octets : si le nombre doit être mis en forme en base 2, il faudra
        * au plus 32 caractères pour le représenter (1 caractère par bit)
        * + 1 octet pour le zéro terminal. */
       char tmp[33];
       char* ptr = &tmp[32]; 
       *ptr = 0; // ICI, Je ne comprends ce qu'il fait
     
       /* En base 10, un nombre négatif est noté avec un signe '-',
        * suivi de la valeur absolue du nombre */
       if(base == 10 && valeur < 0) { 
          valeur = -valeur;
          *dest = '-'; // ICI, Je ne comprends ce qu'il fait
          dest++; // ICI, Je ne comprends ce qu'il fait
       }
     
       /* La conversion s'effectue par divisions successives.
        * A chaque tour de boucle, on extrait un nouveau digit du nombre.
        * La progression se fait du digit le moins significatif au plus significatif. */
       do {
          /* Les digits sont obtenus par divisions successives du nombre à convertir
           * par la base de conversion */
          digit = (unsigned)valeur % base;
          valeur = (unsigned)valeur / base;
     
          /* La chaîne destination se remplit en partant de la fin.
           * Avant d'insérer un nouveau digit, on recule le pointeur d'une position. */
          --ptr;
     
          /* Si le digit est compris entre 0 et 9, on insère le code ASCII du caractère correspondant,
           * sinon, on insère le code ASCII d'une lettre */
          if(digit < 10)
             *ptr = digit + '0'; // ICI, Je ne comprends ce qu'il fait
          else
             *ptr = digit - 10 + 'A'; // ICI, Je ne comprends ce qu'il fait
     
          /* La conversion se poursuit jusqu'à ce que le nombre à convertir soit nul */
       } while(valeur != 0);
     
       /* Pour finit, on copie la chaîne temporaire à l'adresse destination */
       Chaine_copier(dest, ptr); 
    }

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par poche
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
       *ptr = 0; // ICI, Je ne comprends ce qu'il fait
    Traduction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *ptr = '\0'; // ICI, Je ne comprends ce qu'il fait
    Ce code met un caracètre nul à la fin du buffer temporaire, comme fin de chaîne.
    Ainsi, si l'on écrit le nombre cent vingt-trois en base dix, les quatre derniers char du buffer seront { '1', '2', '3', '\0' }.

    Citation Envoyé par poche
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          if(digit < 10)
             *ptr = digit + '0'; // ICI, Je ne comprends ce qu'il fait
          else
             *ptr = digit - 10 + 'A'; // ICI, Je ne comprends ce qu'il fait
    La première ligne ne devrait pas être trop dure à comprendre: Le standard C exige que les codes de caractères chiffrés se suivent de 0 à 9. Ainsi, '0' correspond au code du caractère correspondant à un zéro (caractère n°48 en ASCII), et si on y ajoute la valeur d'un chiffre, on obtient le code du caractère représentant le chiffre en question ('0' + 5 équivaut en ASCII à 48+5, donc 53, qui est le code ASCII de '5').
    La seconde ligne est plus compliquée et ne marche pas partout pour des bases trop grandes (mais ça marche aussi bien en ASCII qu'en EBCDIC pour la base 16, très utilisée). Tout "chiffre" supérieur à 9 est réprésenté par une lettre. Ainsi, en base 16, les "chiffres" vont de 0 à F. Donc, A correspond à la valeur dix, et les codes suivant aux valeurs supérieures. Donc, on fait comme pour le zéro au-dessus, mais on retire dix puisque c'est de là qu'on part.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Par défaut
    merci

    mais à koi sert ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(base == 10 && valeur < 0) { 
          valeur = -valeur;
          *dest = '-'; // ICI, Je ne comprends ce qu'il fait
          dest++; // ICI, Je ne comprends ce qu'il fait
       }

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* ptr = &tmp[32]; 
       *ptr = 0; // ICI, Je ne comprends ce qu'il fait
    Au début, il pointe sur la fin du tableau
    et après il pointe sur l'adresse 0.

    sa serai pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char ptr = &tmp[32]; 
    *ptr = 0

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Non, &tmp[32] est l'adresse du 33ème élément du tableau tmp. C'est dont bien un char *, pas un char.

    Edit : tu te trompes quand tu dis "et après il pointe sur l'adresse 0". Il pointe toujours sur le 33ème élément, mais maintenant cette case contient un 0.

  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 poche Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* ptr = &tmp[32]; 
       *ptr = 0; // ICI, Je ne comprends ce qu'il fait
    Au début, il pointe sur la fin du tableau
    Correct (j'espère que la tableau a au moins une taille de 33 char).
    et après il pointe sur l'adresse 0.
    La syntaxe du C est un peu piégeante. Il faut bien distinguer le sens de '*' lorsque qu'on définit une variable :

    char* ptr; signifie "définir une variable de type pointeur sur char nommée p".

    de celui qui sert à déréférencer la variable pointée :

    *ptr = 0; signifie : "affecter la valeur 0 dans la variable pointée par ptr".

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par poche Voir le message
    à koi sert ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(base == 10 && valeur < 0) { 
          valeur = -valeur;
          *dest = '-'; // ICI, Je ne comprends ce qu'il fait
          dest++; // ICI, Je ne comprends ce qu'il fait
       }
    Si le nombre est négatif (et qu'on l'écrit en décimal), on met un "moins" devant et on le traite comme un nombre positif.

    Au début, il pointe sur la fin du tableau
    et après il pointe sur l'adresse 0.
    Moult te goures: On ne modifie pas le pointeur, seulement le char pointé.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    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 poche Voir le message
    merci

    mais à koi sert ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(base == 10 && valeur < 0) { 
          valeur = -valeur;
          *dest = '-'; // ICI, Je ne comprends ce qu'il fait
          dest++; // ICI, Je ne comprends ce qu'il fait
       }
    dest est un pointeur sur char.
    *dest désigne la valeur de la variable pointée.
    = et l'opérateur d'affectation (copier la valeur de droite dans la variable de gauche)
    '-' est une constante caractère.
    ; est la fin de l'instruction

    *dest = '-'; signifie donc "affecter la valeur du caractère '-' dans la variable pointée par dest".

    ++ est l'opérateur d'incrémentation. Il ajoute 1 à la valeur de la variable. Ici, c'est dest.

    dest++; signifie donc "incrémenter le pointeur de 1".

    Comme le pointeur est de type char et qu'il pointe sur un tableau de char, il va maintenant pointer sur le caractère suivant du tableau.

Discussions similaires

  1. [Débutant] problème de compréhension
    Par Sylvester dans le forum Général Java
    Réponses: 18
    Dernier message: 21/07/2005, 09h16
  2. Réponses: 5
    Dernier message: 11/04/2005, 10h21
  3. [C#] Problème de compréhension de System.Convert ET Provider
    Par papouAlain dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/11/2004, 21h52
  4. onclipevent (problème de compréhension)
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 24/09/2003, 15h09
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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