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 :

Aide pour comprendre la syntaxe d'une macro


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut Aide pour comprendre la syntaxe d'une macro
    Bonjour, j'ai du mal a comprendre ce que fais cette ligne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define fix( num ) ( (num) + ( ((num) % 8) ? ( 8 - ((num) % 8) ) : 0 ) )
    particulièrement, si ca pouvait etre traduit en une fonction normale au lieu d'une macro, ca ressemblerait a quoi exactement ?

    Dans le reste du code la fonction fix() est utilise comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int size1, size2;
    size2 = fix( size1 );
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Si tu veux par exemple stocker des bits dans des octets, il faut x / 8 octets... Et un de plus si le nombre de pixels n'est pas un multiple de 8 . C'est ce que fait apparemment cette fonction. size2 serait le nombre d'octets, et size1 le nombre de bits... J'espère n'avoir pas trop lu en diagonale!

    A+

    Pfeuh

  4. #4
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Serait ce donc une fonction paramétrée de tel sorte a convertir les bits en octets ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define fix( num ) ( (num) + ( ((num) % 8) ? ( 8 - ((num) % 8) ) : 0 ) )
    convertie en fonction normale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #DEFINE TRUE 1
    int fix( num ) { 
     
    if  (( (num) + ( ((num) % 8) == TRUE)
      return ( 8 - ((num) % 8) )
     
    else 
      return 0;
    Est ce que c'est correct ?

    Merci pour les reponses.

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Non. Ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int fix( num ) { 
      if  (num% 8 != 0)  return num+ 8 - num % 8 ;
      else   return num;
    }
    Comme num = num/8*8+num % 8, on peut écrire aussi (division euclidienne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if  (num% 8 != 0)  return num/8*8+ 8 ;
    ...
    Ce qui donne pour valeur de retour :
    num 0 ; retour 0
    num 1 à 8 ; retour 8
    num 9 à 16 ; retour 16
    ....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par diogene Voir le message
    Non. Ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int fix( num ) { 
      if  (num% 8 != 0)  return num+ 8 - num % 8 ;
      else   return num;
    }
    Effectivement, j'avais bien lu en diagonale!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour moi, ça ressemble à un code pour arrondir à 8 supérieurs.

    Ce que je fais plutôt ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define arrondi_sup(val, arr) ( ((val)+(arr)-1) / (arr) * (arr) )
     
    /*Ou encore*/
    #define division_sup(val, arr) ( ((val)+(arr)-1) / (arr) )
    #define arrondi_sup(val, arr) (division_sup((val), (arr)) * (arr))
    /*Car j'ai plus souvent besoin de division_sup que de arrondi_sup*/
    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.

Discussions similaires

  1. Demande d'aide pour comprendre des syntaxes Python
    Par Cyberstein dans le forum Général Python
    Réponses: 13
    Dernier message: 31/12/2009, 22h36
  2. outil/méthode pour vérifier la syntaxe d'une macro
    Par Anouschka dans le forum Linux
    Réponses: 2
    Dernier message: 16/11/2007, 14h05
  3. Réponses: 2
    Dernier message: 10/01/2007, 23h28
  4. [Free Pascal] Aide pour comprendre une erreur de compilation
    Par SimoBenz dans le forum Free Pascal
    Réponses: 7
    Dernier message: 05/12/2006, 18h43
  5. Réponses: 4
    Dernier message: 18/11/2006, 22h58

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