Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1566 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Utilisation de macro

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisation de macro

n°1849300
Skangell71
Posté le 10-02-2009 à 09:29:15  profilanswer
 

Bonjour à tous !  
 
J'aurais une petite question à vous poser ! Je suis actuellement en stage et je dois réaliser un programme pour une entreprise. Ce programme fonctionne grâce à une carte qui ne se trouve pas sur mon lieu de stage.
 
Il faut donc que je créée différentes macros pour remplacer les fonctions utiliséés pour la carte (Mon programme inclut les fichiers servo.h et servo.c) pour pouvoir faire les tests avant de me rendre sur place pour tester le programme.
 
Je ne sais pas si c'est clair pour vous... Mais j'aimerais savoir si il existe des fonctions toutes faites (grâce à différentes fonctions du logiciel Dev C++ ou encore d'Allegro (je doit l'utiliser comme librairie externe)) ou s'il faut que je fasse mes macros moi même.
 
Par exemple j'ai cette fonction qui permet d'écrire un mot (elle se trouve dans le fichier servo.c):
 

Code :
  1. void _OutputW(WORD wPortAdress, WORD wOutputVal)
  2. {
  3. _outpw(wPortAddr, wOutputVal)
  4. }


Je dois la remplacer par une macro mais je ne sais pas trop comment m'y prendre car je ne maitrise pas bien le C et encore moins les macros... Je sais juste que je dois mettre

Code :
  1. #define nom_de_ma_macro ()


 
Merci d'avance pour votre aide, en espérant avoir été claire ! Bonne journée !

mood
Publicité
Posté le 10-02-2009 à 09:29:15  profilanswer
 

n°1850043
Sve@r
Posté le 11-02-2009 à 19:25:27  profilanswer
 

Skangell71 a écrit :

Bonjour à tous !  
 
J'aurais une petite question à vous poser ! Je suis actuellement en stage et je dois réaliser un programme pour une entreprise. Ce programme fonctionne grâce à une carte qui ne se trouve pas sur mon lieu de stage.
 
Il faut donc que je créée différentes macros pour remplacer les fonctions utiliséés pour la carte (Mon programme inclut les fichiers servo.h et servo.c) pour pouvoir faire les tests avant de me rendre sur place pour tester le programme.
 
Je ne sais pas si c'est clair pour vous... Mais j'aimerais savoir si il existe des fonctions toutes faites (grâce à différentes fonctions du logiciel Dev C++ ou encore d'Allegro (je doit l'utiliser comme librairie externe)) ou s'il faut que je fasse mes macros moi même.
 
Par exemple j'ai cette fonction qui permet d'écrire un mot (elle se trouve dans le fichier servo.c):
 

Code :
  1. void _OutputW(WORD wPortAdress, WORD wOutputVal)
  2. {
  3. _outpw(wPortAddr, wOutputVal)
  4. }


Je dois la remplacer par une macro mais je ne sais pas trop comment m'y prendre car je ne maitrise pas bien le C et encore moins les macros... Je sais juste que je dois mettre

Code :
  1. #define nom_de_ma_macro ()


 
Merci d'avance pour votre aide, en espérant avoir été claire ! Bonne journée !


 
T'as aucun outil qui te construira les macro à ta place. Une macro c'est simplement un identificateur qui est remplacé par le préprocesseur par son équivalent.
 
Exemple de macro: #define SOMME(a,b)      a+b
 
Ensuite, si tu écris dans ton code  SOMME(2,3), le préprocesseur convertira cette instruction en 2+3 et c'est cette dernière qui sera compilée.
Autre exemple: SOMME(SOMME(2, 3), 4)   => remplacée par 2+3+4
 
Le problème d'une macro est qu'elle est recopiée tel quel ce qui peut amener un problème si c'est mal écrit.
 
Exemple: 2 * SOMME(2, 3)  => tu t'attends à avoir 10 mais l'instruction réellement lue est "2 * 2 + 3" et la priorité de la multiplication fait que tu récupères 7
Pour pallier à ce premier danger, on entoure la macro de parenthèses
#define SOMME(a, b)       (a + b)
 
Ainsi, 2 * SOMME(2, 3) sera traduit en 2 * (2 + 3) = 10
 
Autre problème: quand les pseudo-arguments sont eux-mêmes des opérations
Exemple: #define CARRE(x)     (x * x)
 
Si tu demandes CARRE(2) ou CARRE(3) pas de pb. Cela sera traduit en (2 * 2) et (3 * 3). Mais si tu demandes CARRE(2 + 3), cela sera converti en (2 + 3 * 2 + 3) = 11 au lieu des 25 espérés.
 
Pour résoudre ce pb, on entoure aussi les pseudo-arguments
#define CARRE(x)      ((x) * (x))
 
Avec ça, CARRE(2+3) sera traduit en ((2 + 3) * (2 + 3)) = 25
 
Voilà la base de la macro. A partir de là, c'est à toi de jouer. Pense bien à écrire ta macro en majuscule ce qui évitera de la confondre avec une fonction ce qui évitera de l'appeler avec du i++ => imagine la valeur de "i" quand elle ressort de CARRE(i++) traduit en ((i++) * (i++))...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1850057
youen
Posté le 11-02-2009 à 19:55:17  profilanswer
 

Je ne vois pas bien ton problème... Tu dois, dans ton programme utiliser des fonctions que tu n'as pas encore, c'est ça ? J'imagine que tu as la documentation des fonctions en questions ? Pourquoi ne pas les remplacer par des fonctions bidons que tu écris toi même ? Bien souvent, ce qu'on peut faire avec des macros, on peut le faire avec du vrai code, et c'est plus propre et moins risqué vis à vis des erreurs dont parle Sve@r par exemple. Mais je ne suis pas sûr du tout d'avoir compris ton problème...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Utilisation de macro

 

Sujets relatifs
utilisation macro pour compléter tableaux[Oracle 10g] Utilisation d'une fonction packagée ds un NOT EXISTS
[Macro office] Ouvertures intempestives du Visual Basic Editormacro Excel VBA : pb dans la création automatique de graphiques
[macro excel] encadrer certaines cellulesUtilisation de DDK pour créer une carte réseaux virtuelle
Découper un fichier word en plusieurs fichiers via une macro Macro transformants les hyperliens text en hyperliens cliquables
Bouton pour executer une macro dans une table access 
Plus de sujets relatifs à : Utilisation de macro


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR