pb de macro en c

pb de macro en c - C - Programmation

Marsh Posté le 06-11-2005 à 19:28:53    

Bonsoir,
j'ai un programme à faire à l'aide de macro. Ce programme doit lire un texte et donner la lettre suivante (a suit z)si c'est une lettre ou le chiffre précédent (9 précède 0)si c'est un chiffre. Il faut aussi différencier lettre MAJ et MIN! Donc j'ai fait le programme suivant qui marche sauf pour le "Z" qui me donne "[" au lieu de me donner "A".sinon le reste marche nikel.J'ai fait différent test et je pense que ça vient de la macro LETTRE_MAJ, mais je vois pas pourquoi!Voila si qqun peut m'aider
 
#include <stdio.h>
#define CHIFFRE(X)  ((X)<='9' && (X)>='0')
#define LETTRE_MAJ(X) (((X)<='Z') && ((X)>='A'))
#define LETTRE_MIN(X) ((X)<='z' && (X)>='a')
#define LETTRE(X) ((LETTRE_MAJ(X) or LETTRE_MIN(X))? true:false)
#define SUIVANT(X,INF,SUP) (((((X)<='y')||((X)<='Y')) && (((X)>='A')||((X)>='a')))?(X=X+1):(X=INF))
#define PRECEDENT(X,INF,SUP)(((X)<='9' && (X)>='1')?(X=X-1):(X=SUP))
#define LIRE_LIGNE(X)  scanf ("%s[^\n]",X)
/*#define FORMAT "80%[^\n]%*c" */
 
int main(void)
{
  char buffer [10] [80];
  int i=1;/* lignes*/
  int j=0;/* colonnes*/
 
bool fin=false;
 
  printf("Saisir la ligne:" );
  LIRE_LIGNE(buffer[i]);
  j=0;
  while (buffer[i][j]!='\n' && j<=80)
    {
  if CHIFFRE(buffer[i][j])  
        buffer[i][j]=PRECEDENT(buffer[i][j],'0','9');  
             
    else
     {
          if (LETTRE_MIN(buffer[i][j]))
       buffer[i][j]= SUIVANT(buffer[i][j],'a','z');
       else
       {
            if (LETTRE_MAJ(buffer[i][j]))
         buffer[i][j]= SUIVANT(buffer[i][j],'A','Z');  
          }
     }
     j++;
     }
    printf("%d: %s",i,buffer[i]);  
}

Reply

Marsh Posté le 06-11-2005 à 19:28:53   

Reply

Marsh Posté le 06-11-2005 à 19:32:27    

vas voir dans <ctype.h>
'or' n'est pas du C

Reply

Marsh Posté le 06-11-2005 à 20:03:31    

bool non plus.
 
main() doit retourner un int, pourtant il n'y a pas de return.
 
Et j'ai pas bien compris le délire sur les macros, surtout qu'elles sont magnifiquement laides. Le nombre de parenthèses me fait penser à du Lisp.
Sérieux, pourquoi des macros ?
 
PS : faut mettre le code entre les balises du forum [cpp ][/cpp] (sans espace) sinon c'est peu lisible.
 
 
EDIT : et pour ce que tu souhaites faire, regarde du côté du modulo


Message édité par Elmoricq le 06-11-2005 à 20:06:51
Reply

Marsh Posté le 06-11-2005 à 20:40:54    

j'ai pas le choix! Les macros c'est le but de mon exercice, donc faut bien que je les fasse!!!!!
ok pour les balises, dsl je savais pas!

Reply

Marsh Posté le 06-11-2005 à 21:27:12    

en ebcdic ca va donner quoi tout ca ? [:pingouino]


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 06-11-2005 à 21:46:59    

0x90 a écrit :

en ebcdic ca va donner quoi tout ca ? [:pingouino]


Méchant garçon...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-11-2005 à 22:45:13    

Zigzig9 a écrit :

j'ai pas le choix! Les macros c'est le but de mon exercice, donc faut bien que je les fasse!!!!!


 
Oh la la. [:kzimir]  
 
C'est un professeur qui t'a demandé de faire ça ?
 
Non parce que, les macros sont des outils formidables pour alléger certaines parties répétitives et autrement plus difficiles à lire dans le code. Là, ton exercice te demande de faire tout le contraire d'une macro.
 
Parce que ça me fait mal de voir une bouillie de parenthèses pareille, je te donne un exemple plus simple de macro pour incrémenter les minuscules, en utilisant les modulos :

Code :
  1. #define INC_MIN(X) (X - 'a' + 1) % 26 + 'a'


Quand même plus lisible que les opérateurs ternaires, pour le coup. A appliquer sur les majuscules c'est facile, t'as pas grand chose à changer.  
Pour décrémenter les chiffres, y a une astuce à appliquer pour rester dans les modulos. Je te laisse la chercher ('vais quand même pas te faire tes exos :o )


Message édité par Elmoricq le 06-11-2005 à 22:46:53
Reply

Marsh Posté le 07-11-2005 à 21:19:01    

Ben justement, Elmoricq, dans la macro que tu donnes il manque des parentheses. Le regle de base quand on ecrit des macro, c'est de toujours mettre des parentheses autour des arguements, et de toujours mettre des parentheses autour de la marco. Parce qu'on ne sais jamais ce qui va etre passe en arguement, et on ne sais jamais dans quel contexte la macro va etre utilisee.
 
Bref ta macro devrait etre :

Code :
  1. #define INC_MIN(X) (((X) - 'a' + 1) % 26 + 'a')

Reply

Marsh Posté le 07-11-2005 à 22:25:17    

Hmm, ta façon de faire autorise l'écriture de :  
 

if INC_MIN(buffer[i][j])


 
Donc c'est assez laid.
 
Mais d'un autre côté, si on écrit :

INC_MIN(buffer[i][j]) * 2


avec ma méthode, c'est vrai qu'on est un peu mal. :/
 
A tout prendre, c'est vrai qu'avec des parenthèses c'est mieux, une syntaxe laide est "moins pire" qu'un calcul faux (et de loin).
Mais décidemment, je n'aime pas les macros dès qu'elles dépassent les facilités d'écriture, je trouve que INC_MIN illustre bien la macro qui devrait être une fonction, en fait.
[:spamafote]
 
EDIT : je parle dans une pratique courante, je reconnais certains avantages des macros, hein...  


Message édité par Elmoricq le 07-11-2005 à 22:28:55
Reply

Sujets relatifs:

Leave a Replay

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