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 :

Explication sur langage C


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut Explication sur langage C
    Bonjour à tous,

    Je ne connais pas le langage C, mais j'aimerais que l'on puisse m'expliquer ce qui suit :

    #if 0
    s = (((((u32 *) h)[1])) * 5) & 0x00C0C0C0;
    i = (((((u32 *) h)[0])) * 5) & 0xC0C0C0C0;
    s = ((s * (1 + 64 + 4096)) >> 8) & 0x3F00;
    i = ((i * (1 + 64 + 4096 + 262144)) >> 24) | s;
    #endif

    i est est u32
    s est un s32

    Je comprend les valeurs hexadécimales, les opérations bit à bit et le
    décalage de bits à droite.
    Que signifie le signe * ?
    Je pense que c'est une histoire de pointeur... ou de multiplication...
    #if 0 ... On ne fait qu'une fois ?

    Je fais du VB6 et aimerais pouvoir l'interpréter.

    Merci par avance pour vos réponses

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    S'il s'agit juste de convertir du code C en un autre langage, déjà je peux te dire que tout ce qui se trouve entre et sera ignoré. Même le compilateur n'en verra pas la couleur.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 444
    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 444
    Par défaut
    Bonsoir,

    Citation Envoyé par Clo72 Voir le message
    Je ne connais pas le langage C, mais j'aimerais que l'on puisse m'expliquer ce qui suit :
    Effectivement, ça peut paraître obscur de prime abord si l'on n'est pas habitué. Donc, pour répondre à tes questions :

    Que signifie le signe * ?
    Je pense que c'est une histoire de pointeur... ou de multiplication...
    En effet, cela dépend du contexte. S'il se trouve entre deux expressions évaluables, c'est une multiplication. Sinon, c'est soit une déclaration de pointeur, soit c'est un « déréférencement », c'est-à-dire une « utilisation » du pointeur en indiquant que l'on se réfère à ce qu'il pointe plutôt qu'au pointeur lui-même. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        int     x;
        int     *ptr;
     
        ptr = &x;
        *ptr = 8;
    x est un entier et ptr est un « pointeur sur un entier ». À la ligne 4, j'affecte l'adresse de la variable x à ce pointeur. À la cinquième ligne, j'affecte la valeur « 8 » à ce qui est pointé par ptr. Donc, à l'issue du processus, x vaut 8.

    Il existe également typedef qui te permet de définir de nouveaux noms de types à partir des existants. C'est pratique quand les définitions originales sont trop compliquées (ce qui arrive souvent avec les pointeurs de fonction, par exemple) ou lorsque l'on veut choisir le type le plus adapté à un cas de figure donné en fonction de l'architecture sur laquelle tu tournes. Donc u32 est probablement né d'un « typedef unsigned long int u32 ».

    Il existe enfin le transtypage ou cast, qui consiste à convertir une valeur d'un certain type vers un autre en la faisant précéder de ce nom de type entre parenthèses. De fait, « (u32 *)h » signifie que « la valeur de h doit être considérée comme étant un pointeur sur un u32 » (étant entendu que h doit déjà être en soi un pointeur). De là, tu peux l'indexer comme un tableau avec la paire de crochets supplémentaire pour récupérer l'élément qui t'intéresse. Le « * 5 » qui suit est bien une multiplication.

    Pour compléter ce que dit Jéroman, maintenant, toutes les lignes commençant par « # » sont à l'intention du pré-compilateur, dont le rôle est de « préparer » le code source, avant qu'il soit réellement interprété par le compilateur. Ça consiste généralement à remplacer les constantes symboliques définies avec #define par leur valeur effective. Ça permet aussi de faire de la compilation conditionnelle avec #if, #ifdef, … #endif.

    « 0 » étant toujours faux, tout ce qui se trouve entre #if 0 et #endif sera donc éliminé avant même d'être compilé. C'est donc un bon moyen pour désactiver rapidement tout un bloc de code, tout en laissant la possibilité au programmeur de le réactiver et re-désactiver rapidement (en changeant simplement le 0 en 1 et réciproquement). En outre, le pré-compilateur reconnaît les #if imbriqués. C'est pratique parce que cela te garantit que cela fonctionnera toujours même si d'autres #if se trouvent déjà au sein du code d'une part, mais également s'il contient des commentaires.

    En effet, on pourrait penser que mettre le bloc entier en commentaire avec « /* » et « */ » suffirait à le désactiver. C'est vrai mais la syntaxe des commentaires n'est pas récursive : si d'autres commentaires se trouvaient dans le code, alors le bloc commenté s'arrêterait au premier « */ » rencontré et pas à celui qui correspond au premier « /* ».

    L'utilisation de « #if 0 » est donc très répandue, à tel point que les principaux éditeurs de texte en reconnaissent l'usage et sont capables de passer en couleur « commentaire » le bloc entier marqué de la sorte.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 20
    Par défaut
    Merci beaucoup Obsidian et Jeroman

    Tout ceci très clair

    Claude

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

Discussions similaires

  1. [Multimédia] Explication sur stream audio
    Par champion dans le forum Développement
    Réponses: 1
    Dernier message: 20/01/2005, 12h14
  2. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15
  3. s.v.p :explication sur le ".h" et dll de l'opengl
    Par Asmod_D dans le forum OpenGL
    Réponses: 1
    Dernier message: 22/11/2004, 10h32
  4. Réponses: 28
    Dernier message: 18/08/2003, 11h54
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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