A voir également:
- Help Macro en C ! calcule bête et méchant !!!
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Macro word - Guide
- Jitbit macro recorder - Télécharger - Confidentialité
- Pense bête windows - Accueil - Applications & Logiciels
- Pense bête microsoft - Guide
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
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.
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?
Utilisateur anonyme
16 juin 2010 à 12:42
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 =)
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
Utilisateur anonyme
16 juin 2010 à 12:43
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;
}
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.
Utilisateur anonyme
Modifié par nagashima le 16/06/2010 à 13:03
Modifié par nagashima le 16/06/2010 à 13:03
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 !
Utilisateur anonyme
16 juin 2010 à 13:05
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
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
Utilisateur anonyme
16 juin 2010 à 13:13
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 ...)
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 ...)
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.
Utilisateur anonyme
16 juin 2010 à 13:30
16 juin 2010 à 13:30
pas de soucis, bonne chance et bonne journée à toi aussi ;) !
Modifié par nagashima le 16/06/2010 à 14:44
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 ;)
16 juin 2010 à 14:55
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
Modifié par nagashima le 16/06/2010 à 14:59
[edit]
enfin je parle de ce genre de fonction ;)
16 juin 2010 à 17:00
Modifié par wvavy le 16/06/2010 à 17:14
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?