En C++, je cherche à trouver le moyen de placer un condition sur le temps
d'éxécution d'une boucle : par exemple
si (temps d'execution < 50 ms ) { wait } else { continue }
je v m'en servir pour un programme qui va afficher une série d'images et je
vois pas trop comment faire pour "brider" le programme .
Non, si on travaille en non signé (en signé on aura des surprises). Par exemple 0x32 - 0xFFFFFFFF fait 0x33 sur un DWORD, qui est bien le résultat qu'on attendait.
Bon je détaille un peu plus au cas où certains ne comprennent pas : pour faire une soustraction on fait une addition du complément à 2
Et ça c'est qu'on soit en signé ou pas. Le signe c'est juste l'interprétation qui est donnée du nombre.
Donc tant que ton delta est < 0x80000000 même en signé t'aura pas de problème. Après le hic c'est que le bit de poids fort est à 1 car le delta est "trop grand", et c'est interprété comme un nombre négatif.
Supposons par exemple ticks2 - ticks1 = 0x80001234.
if ((ticks2 - ticks1) < 50)
C'est négatif donc le test est vrai.
{ Sleep(50 - (ticks2 - ticks1));
50 - 0x80001234 = 50 + (~0x8001234 + 1) = 50 + (0x7ffedcb + 1) = 0x7ffedfe ce qui n'est pas vraiment une bonne valeur pour le sleep.
} }
-- cns
On 2004-04-26, HalfWolf <halfwolf@free.fr> wrote:
Non, si on travaille en non signé (en signé on aura des surprises).
Par exemple 0x32 - 0xFFFFFFFF fait 0x33 sur un DWORD, qui est bien le
résultat qu'on attendait.
Bon je détaille un peu plus au cas où certains ne comprennent pas :
pour faire une soustraction on fait une addition du complément à 2
Et ça c'est qu'on soit en signé ou pas. Le signe c'est juste
l'interprétation qui est donnée du nombre.
Donc tant que ton delta est < 0x80000000 même en signé t'aura pas de
problème. Après le hic c'est que le bit de poids fort est à 1 car le
delta est "trop grand", et c'est interprété comme un nombre négatif.
Supposons par exemple ticks2 - ticks1 = 0x80001234.
if ((ticks2 - ticks1) < 50)
C'est négatif donc le test est vrai.
{
Sleep(50 - (ticks2 - ticks1));
50 - 0x80001234 = 50 + (~0x8001234 + 1)
= 50 + (0x7ffedcb + 1)
= 0x7ffedfe
ce qui n'est pas vraiment une bonne valeur pour le sleep.
Non, si on travaille en non signé (en signé on aura des surprises). Par exemple 0x32 - 0xFFFFFFFF fait 0x33 sur un DWORD, qui est bien le résultat qu'on attendait.
Bon je détaille un peu plus au cas où certains ne comprennent pas : pour faire une soustraction on fait une addition du complément à 2
Et ça c'est qu'on soit en signé ou pas. Le signe c'est juste l'interprétation qui est donnée du nombre.
Donc tant que ton delta est < 0x80000000 même en signé t'aura pas de problème. Après le hic c'est que le bit de poids fort est à 1 car le delta est "trop grand", et c'est interprété comme un nombre négatif.
Supposons par exemple ticks2 - ticks1 = 0x80001234.
if ((ticks2 - ticks1) < 50)
C'est négatif donc le test est vrai.
{ Sleep(50 - (ticks2 - ticks1));
50 - 0x80001234 = 50 + (~0x8001234 + 1) = 50 + (0x7ffedcb + 1) = 0x7ffedfe ce qui n'est pas vraiment une bonne valeur pour le sleep.
} }
-- cns
halfwolf
Cyrille Szymanski wrote in message news:<408d4fe5$0$20151$...
On 2004-04-26, HalfWolf wrote:
> Non, si on travaille en non signé (en signé on aura des surprises). > Par exemple 0x32 - 0xFFFFFFFF fait 0x33 sur un DWORD, qui est bien le > résultat qu'on attendait.
Bon je détaille un peu plus au cas où certains ne comprennent pas : pour faire une soustraction on fait une addition du complément à 2
Et ça c'est qu'on soit en signé ou pas. Le signe c'est juste l'interprétation qui est donnée du nombre.
Oui, j'ai fait un raccourci. Quand je parlais de surprises en signé, je pensais au test par rapport à 50, qui risque de faire ce que tu as décris après.
De façon générale, GetTickCount retourne un DWORD et je trouve qu'il est malsain de stocker le retour dans un INT. Après, le résultat d'une soustraction de 2 DWORDs, il faut voir en fonction du comportement attendu. Ici il vaut mieux exprimer le résultat en DWORD, ça permet, comme tu l'as démontré, d'utiliser la particularité du modulo pour faire fonctionner le programme dans tous les cas.
HalfWolf
Cyrille Szymanski <cns2@cns.invalid> wrote in message news:<408d4fe5$0$20151$636a15ce@news.free.fr>...
On 2004-04-26, HalfWolf <halfwolf@free.fr> wrote:
> Non, si on travaille en non signé (en signé on aura des surprises).
> Par exemple 0x32 - 0xFFFFFFFF fait 0x33 sur un DWORD, qui est bien le
> résultat qu'on attendait.
Bon je détaille un peu plus au cas où certains ne comprennent pas :
pour faire une soustraction on fait une addition du complément à 2
Et ça c'est qu'on soit en signé ou pas. Le signe c'est juste
l'interprétation qui est donnée du nombre.
Oui, j'ai fait un raccourci. Quand je parlais de surprises en signé,
je pensais au test par rapport à 50, qui risque de faire ce que tu as
décris après.
De façon générale, GetTickCount retourne un DWORD et je trouve qu'il
est malsain de stocker le retour dans un INT.
Après, le résultat d'une soustraction de 2 DWORDs, il faut voir en
fonction du comportement attendu.
Ici il vaut mieux exprimer le résultat en DWORD, ça permet, comme tu
l'as démontré, d'utiliser la particularité du modulo pour faire
fonctionner le programme dans tous les cas.
Cyrille Szymanski wrote in message news:<408d4fe5$0$20151$...
On 2004-04-26, HalfWolf wrote:
> Non, si on travaille en non signé (en signé on aura des surprises). > Par exemple 0x32 - 0xFFFFFFFF fait 0x33 sur un DWORD, qui est bien le > résultat qu'on attendait.
Bon je détaille un peu plus au cas où certains ne comprennent pas : pour faire une soustraction on fait une addition du complément à 2
Et ça c'est qu'on soit en signé ou pas. Le signe c'est juste l'interprétation qui est donnée du nombre.
Oui, j'ai fait un raccourci. Quand je parlais de surprises en signé, je pensais au test par rapport à 50, qui risque de faire ce que tu as décris après.
De façon générale, GetTickCount retourne un DWORD et je trouve qu'il est malsain de stocker le retour dans un INT. Après, le résultat d'une soustraction de 2 DWORDs, il faut voir en fonction du comportement attendu. Ici il vaut mieux exprimer le résultat en DWORD, ça permet, comme tu l'as démontré, d'utiliser la particularité du modulo pour faire fonctionner le programme dans tous les cas.
HalfWolf
Cyrille Szymanski
On 2004-04-27, HalfWolf wrote:
Oui, j'ai fait un raccourci. Quand je parlais de surprises en signé, je pensais au test par rapport à 50, qui risque de faire ce que tu as décris après.
Oui oui je voulais pas remettre en doute tes propos, très justes au passage mais apporter quelques précisions.
Parce qu'au fond c'est pas insurmontable à comprendre et ça me choque que beaucoup de gens pensent le contraire.
-- cns
On 2004-04-27, HalfWolf <halfwolf@free.fr> wrote:
Oui, j'ai fait un raccourci. Quand je parlais de surprises en signé,
je pensais au test par rapport à 50, qui risque de faire ce que tu as
décris après.
Oui oui je voulais pas remettre en doute tes propos, très justes au
passage mais apporter quelques précisions.
Parce qu'au fond c'est pas insurmontable à comprendre et ça me choque
que beaucoup de gens pensent le contraire.
Oui, j'ai fait un raccourci. Quand je parlais de surprises en signé, je pensais au test par rapport à 50, qui risque de faire ce que tu as décris après.
Oui oui je voulais pas remettre en doute tes propos, très justes au passage mais apporter quelques précisions.
Parce qu'au fond c'est pas insurmontable à comprendre et ça me choque que beaucoup de gens pensent le contraire.