Utilisation de macro

Utilisation de macro - C - Programmation

Marsh Posté le 10-02-2009 à 09:29:15    

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 !

Reply

Marsh Posté le 10-02-2009 à 09:29:15   

Reply

Marsh Posté le 11-02-2009 à 19:25:27    

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.
Reply

Marsh Posté le 11-02-2009 à 19:55:17    

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...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed