Help Macro en C ! calcule bête et méchant !!!

Fermé
wvavy - 16 juin 2010 à 12:29
 wvavy - 17 juin 2010 à 11:22
Bonjour,
Pouvez vous, SVP me dire que vaut a et b sans compile le programme,juste le tourner à la main. Merci à vous. Ce que je trouve et ce que affiche le compilateur ce n'est pas du tout la meme chose .
je donnerai les deux résultat par la suite.
Merci pour vos réponses.

*****************************************
#include <stdio.h>
#include <stdlib.h>
#define A(n) ((n>0)? n:-n) // ici c 'est juste une condition si n>0vrai alors A(n), sinon A(-n).



int main()
{
int a,b=-8;
a=A(b+1);

printf("Affichage 1:a= %d et b= %d \n", a,b);

return 0;
}

*********************************



A voir également:

13 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
16 juin 2010 à 14:41
mdr ! L'erreur typique de "pourquoi il ne faut pas utiliser les macro pour les fonctions mathématique" !
Si ton compilateur est assez récent, mieux faut utiliser les fonctions "inline"
Sur le papier, et sans compiler, je trouve 9 aussi pour a.
En effet, le préprocesseur ne fait QUE du traitement de TEXTE. Pour t'en convaincre, si tu utlise gcc, fait "gcc -E prog.c" et tu verras le résultat.
Lorsque tu écris A(b+1) le préprocesseur remplace ta ligne par :
((n>0)? n:-n) avec n=b+1 (en terme de texte) donc cela fait :
((b+1>0)? b+1:-b+1)
Donc, si b = -8, b+1 est inférieur à 0, tu retournes le deuxième terme, c'est à "-b+1", ce fait bien 9 (--8+1=8+1=9).
J'espère que c'est clair ?

Tu n'aurais pas eu le souci avec une fonction qui elle fait un passage par valeur.
int A(int n){return ((n>0)?n:-n);}

La solution si tu tiens à utiliser absolument les macro (vraiment pas conseiller) c'est de bien protéger tes valeurs avec des parenthèses. Ainsi, en changeant -n par -(n) tu n'aura plus de souci.
Juste pour rire, à la place de A(b+1), essai A(-b+1) avec b=8.
1
yop,
donc en fait ca fait bien ce que j'avais dis, et je pense que c'est l'un de ses professeurs qui leur à demandé ... en tout cas merci pour cette explication plus complète ;)
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
16 juin 2010 à 14:55
absolument pas : le "+1" n'est pas traité après "l'appel" (en macro il ne s'agit pas d'un appel). Il s'agît d'une histoire de priorité des opérateurs, et du mécanisme des macros (une abomination !).
L'example académique est :
#define SQR(n) (n*n)
...
int a=SQR(2+3);

Tu t'attendrais à avoir a=5²=25, mais a = 11, car en remplaçant, on a int a=2+3*2+3
0
ok j'ai compris ! maintenant reste à voir l'intérêt des appels préprocesseurs mais j'ai appris quelque chose, merci !

[edit]
enfin je parle de ce genre de fonction ;)
0
Char snipeur, merci pour ton explication. Tout est claire maintenant. j'avais pensé effectivement à ta solution mais je n'été pas trop convaincu. depuis le debut je partais du principe que l'expression b+1 remplace le n en entier. du coup impossible de trouver ce que le compilateur donne. C'est vrai les Marco c 'est prise de tête. en tout cas merci à tous pour vos réponse. encore une notion comprise. bonne journée à vous.
0
alors juste pour rire: donc si on A(-b+1) avec b=8.
ce que je fait.
(-b+1) >0? :A(-b+1 --b+1) .
(-b+1)<0 donc on retourne le deuxième terme, c'est à "--b+1",
--8+1 =9 .
est ce bien cela?
0
Utilisateur anonyme
16 juin 2010 à 12:31
b=-8 et a=-7 non?
0
si on part du principe que b+1>0 est vrai oui on trouve a=-7 et b=-8.
or ici b+1>0 est faux. car -8+1=-7 et -7<0. donc a=7. Qu'en pense tu?
0
Utilisateur anonyme
16 juin 2010 à 12:42
oui mais sinon, sa rappel a(-n) soit a(--7) , soit a(7) puis inverse le signe et donc au final de fait pas de changement \o/

et comme -7 ne rentre pas dans la condition, n reste inchangé (pour toi, a), et reste donc à -7 =)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
16 juin 2010 à 12:43
en fait ca te ferai la fonction :

void mafonction(int * a) //*car sinon on ne change pas la valeur de base
{
if( &a > 0)
&a = -&a;
}
0
ok ok c 'est bête et méchant, quoi. Et donc le seul souci qui se pose c'est que le compilateur me donne.
b=-8 la ok mais a lui vaut 9. grrrrr ca me prend la tête. essaye de compiler le petit prog que j'ai posté tu verra.
0
bah non, b est bien égal à -8, il n'y a aucuns changement pour lui Oo

d'ailleur je me suis trompé, désolé :

int mafonction(int a)
{
if( a > 0)
return -a;
else return a;
}


ta confusion vient surement de mon erreur =)
0
ok ok. donc on d'accord que la valeur de b=-8. mais moi quand je compile a=9.
0
Pour résumer, lorsqu'on fait tourner le prog à la main, on trouve . A=7 et B=-8
et lorsqu'on compile A=9 et B=-8. bizarrrr !
0
Utilisateur anonyme
16 juin 2010 à 13:05
mmmh en effet c'est étrange ... car en fait la fonction ne fait que rendre un nombre négatif s'il ne l'est pas ... donc le simple fait qu'il te renvoi un nombre positif est étrange =)

ca voudrait dire que tu implémente sans prendre en compte le '-' ce qui normalement n'est pas logique =/

je tente la compil et je te redis
0
Utilisateur anonyme
16 juin 2010 à 13:13
bon en fait le ? signifierai que la proposition est fausse, et A(n) renverrai donc la valeur absolue de la valeur passé en paramètre (désolé je suis pas super calé en fonction préprocesseur)

et donc, le +1 serai donc traité APRES l'appel de la fonction :

ça fait a = A(b) +1 ;

(ça me parait tiré par les cheveux mais je vois que ça comme explication ...)
0
oui en effet c 'est à tiré par les cheveux. on va dire que il faut le prendre comme ça. et puis je suis tout a fait d'accord avec ton explication. a = A(b) +1 ; je n'en vois vraiment pas d 'autre. Merci en tout cas pour toutes tes réponses. bon après midi à toi.
0
Utilisateur anonyme
16 juin 2010 à 13:30
pas de soucis, bonne chance et bonne journée à toi aussi ;) !
0