Help Macro en C ! calcule bête et méchant !!!
wvavy
-
wvavy -
wvavy -
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.
*****************************************
*********************************
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:
- Help Macro en C ! calcule bête et méchant !!!
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Jitbit macro recorder - Télécharger - Confidentialité
- Un pense-bête - Guide
- Pense bête windows - Accueil - Applications & Logiciels
13 réponses
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.
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.
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?
or ici b+1>0 est faux. car -8+1=-7 et -7<0. donc a=7. Qu'en pense tu?
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 =)
et comme -7 ne rentre pas dans la condition, n reste inchangé (pour toi, a), et reste donc à -7 =)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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;
}
void mafonction(int * a) //*car sinon on ne change pas la valeur de base
{
if( &a > 0)
&a = -&a;
}
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.
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.
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 =)
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 =)
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 !
et lorsqu'on compile A=9 et B=-8. bizarrrr !
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
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
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 ...)
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 ...)
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 ;)
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
[edit]
enfin je parle de ce genre de fonction ;)
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?