clempar55
Messages postés59Date d'inscriptionsamedi 1 janvier 2005StatutMembreDernière intervention 4 avril 2007
-
11 oct. 2006 à 19:22
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 2007
-
12 oct. 2006 à 18:17
J'ai fait un petit programme tout à l'heure pour voir si on pouvait incrementer un double et j'ai fait le test suivant:
double d=32.5;
printf(" d=%f \n d++=%f \n d=%f \n", d , d++ , d );
Cela peut ne pas paraitre très clair, mais le fonctionnement est sensé être simple: on affiche la valeur de d, puis la valeur de d++ , et enfin la valeur de d incrémentée. La console devrait donc afficher:
d=32.500000000
d++=32.50000000
d=33.500000000
Mais elle affiche en fait :
d=33.500000
d++=33.500000
d=32.500000
Je me demandais ce qui peut bien etre responsable de ce comportement. Es-ce le compilo( j'utilise GCC )? Ou bien une mauvaise utilisation de l'operateur ++ , ou enfin la fonction printf ?
Merci
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 11 oct. 2006 à 20:35
C'est un probleme du a l'appel du ++ dans une pile d'argument , en effet rien ne te dit que les arguments sont appelés l'un a la suite de l'autre pour t'en convaicre
#include <stdio.h>
#include <stdlib.h>
int aff(int nb)
{
printf("appel de aff(%d)\n",nb);
return nb;
}
int main()
{
printf("%d %d %d\n",aff(0),aff(1),aff(2));
system("pause");
return 0;
}
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 11 oct. 2006 à 20:32
Sauf erreur de ma part, l'opérateur "++" est défini seulement pour les int. Pour tous les autres types, comportement non garantis...
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 11 oct. 2006 à 23:00
Pour un peu plus d'infos je vais expliquer rapidement des principes du fonctionnements d'appel d'une fonction .. ( vite fait .. je suis pas expert ^^)
en gros , il met les arguments dans une pile , les fonctions etant calculé a l'empilement , seulement une fois dans ta fonction il depile le premier en 1er, donc le dernier en dernier, et le dernier est celui le plus en dessous donc celui qui a été empilé le premier .. cela explique cet ordre d'appel et il faut donc faire attention quand on appelle plusieurs fonctions dans des arguments ^^
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 11 oct. 2006 à 23:08
Les fonctions sont pour la plupart en __stdcall ou en __cdecl (et pas en pascal), ce qui signifie qu'il pushe les paramètres de droite à gauche dans la pile.
<hr size="2" width="100%" />Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 12 oct. 2006 à 00:45
printf, sprintf et autres variantes sont en __cdecl pour cause de nbr de params indéfinis, il n'y a donc que l'appelant qui puisse dépiler car il est le seul à en connaitre le nombre.
rrk275
Messages postés540Date d'inscriptionvendredi 25 juin 2004StatutMembreDernière intervention 1 octobre 20072 12 oct. 2006 à 18:17
Ah .. me basait sur des constatation personelle.. dsl ^^ heuresement que quelqu'un a su me remettre dans le bon chemin... je m'en vais de ce pas taper sur google me renseigner sur ces __cdecl ..
Louis