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 :

Une syntaxe inconnue


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut Une syntaxe inconnue
    Bonjour à tous, en travaillant sur un code de calcul je suis tombée sur la fonction suivante :

    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
     
    compute_parameter_hash_table(
         register char *s
    )
    {
     register int h;
     
      h= s[0];
      if(s[1])
        h |= (s[1])<<8;
      else
        return(h);
      if(s[2])
        h |= (s[2])<<16;
      else
        return(h);
      if(s[3])
        h |= (s[3])<<24;
      return(h);
    }
    Je ne comprend pas du tout ce que signifie l'expression Quelqu'un a t-til une idée ? merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 674
    Points
    23 674
    Par défaut
    Bonsoir,

    Je ne comprend pas du tout ce que signifie l'expression Quelqu'un a t-til une idée ? merci.
    h |= est équivalent à h = h |. « | » est le OU logique bit-à-bit, en C.

    << 8 décale l'opérande de huit bits vers la gauche.

    Donc, ton expression commence par décaler la valeur de s[1] de huit bits vers la gauche (ce qui, au passage, revient à la multiplier par 256) puis la superpose avec la valeur de h.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut essayons de comprendre
    Merci de ta réponse,

    Comme cela reste un peu flou je vais essayer de traduire ce que je comprends :
    On a une chaine de caractere s, constituée de n caractères.

    * h est égal au premier caractère

    * si s a plus d'un caractère, on superpose h à s[1]<<8 c'est à dire au premier caractère de la chaine.

    * si s a plus de 2 caractère, on superpose h à s[2]<<16, c'est à dire toujours au premier caractère de la chaine.

    * etc..
    Reste à savoir quel est l'intéret de faire ça...

    Question bonus : Quand tu dis 'Superposer' c'est à dire sommer la valeur en binaire ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 378
    Points : 23 674
    Points
    23 674
    Par défaut
    En fait, c'est le contraire : c'est h qui est enrichi de la valeur du caractère traité.

    Les opérations logique ET et OU sont utilisées pour traiter des valeurs lorsqu'elles sont au dessous de la taille du mot standard. Notamment au niveau du bit individuel, donc.

    Un ET est l'équivalent d'une intersection mathématique et un OU, d'une union. Lorsque tu fais « a | b », tous les bits qui sont à un dans « a » ou dans « b » (ou les deux, a fortiori) seront à un dans le résultat. Ça permet donc d'ajouter un motif à un registre sans modifier l'état des bits à un déjà en place.

    Dans le cas présent, ta fonction fait l'hypothèse implicite qu'un int tient sur quatre octets et un char sur un seul (ce qui est généralement le cas). Elle sert en fait à charger une valeur en little endian dans ton registre : le premier octet est chargé normalement, et prend donc la place des bits 0 à 7. On regarde ensuite si le suivant est non-nul (marqueur de fin de chaîne ?) et, le cas échéant, on l'ajoute à la suite, dans les bits 8 à 15. Même chose pour le troisième, de 16 à 23.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Points : 52
    Points
    52
    Par défaut 2 Dernières précisions
    Si j'ai bien compris :
    h est codé comme 4 octets :
    {0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}

    On remplace le premier octet par s[1] , par exemple :

    h={1 0 1 0 1 1 1 1}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}

    Puis on enrichi le deuxième octet de h avec s[2].
    C'est à dire que l'expression
    signifie que l'on décale les 8 bits de s[1] vers la droite plutot que la gauche non ?

    enfin je n'ai que peu de notion de 'endianess' : dans un ordinateur classique l'écriture se fait-elle en little endian ou big-endian ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 708
    Points : 31 018
    Points
    31 018
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par latitude38 Voir le message
    Si j'ai bien compris :
    h est codé comme 4 octets :
    {0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}

    On remplace le premier octet par s[1] , par exemple :

    h={1 0 1 0 1 1 1 1}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}
    Salut
    Le premier octet en partant de la "droite"
    h={0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0 0}{0 0 0 0 0 0 0}{1 0 1 0 1 1 1 1} (qu'on peut, quand on sait convertir du binaire en hexa, noter aussi 0x00 0x00 0x00 0xAF pour raccourcir l'écriture)

    Citation Envoyé par latitude38 Voir le message
    Puis on enrichi le deuxième octet de h avec s[2].
    C'est à dire que l'expression
    signifie que l'on décale les 8 bits de s[1] vers la droite plutot que la gauche non ?
    La flèche << symbolise un déplacement vers la gauche. Comme ton hypothèse de placement initial est inversée, tu as alors inversé le sens de l'opérateur pour retrouver tes billes.
    Donc si s[1] vaut 0xAA, alors en fin d'opération h vaut 0x00 0x00 0xAA 0xAF

    Citation Envoyé par latitude38 Voir le message
    enfin je n'ai que peu de notion de 'endianess' : dans un ordinateur classique l'écriture se fait-elle en little endian ou big-endian ?
    Ca dépend de l'architecture. C'est d'ailleurs un souci à prendre en compte lorsque l'on transfère des valeurs numériques via réseau d'un ordi vers un autre...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [PHP 5.3] Syntaxe inconnue dans une application
    Par philodido dans le forum Langage
    Réponses: 16
    Dernier message: 20/07/2011, 10h50
  2. Liste de toutes les tables d'une base inconnue
    Par TTiger dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/11/2005, 07h59
  3. Réponses: 2
    Dernier message: 05/08/2005, 14h33
  4. [langage] comprendre une syntaxe particulière
    Par mat21 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2004, 18h12
  5. [RICHEDIT] -> Coloriser une syntaxe ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 6
    Dernier message: 18/01/2004, 12h57

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