OVH Cloud OVH Cloud

case...

7 réponses
Avatar
ecm.mec
Salut,

Etrangeté rencontrée quant au résultat fournit par le code suivant :


switch (num) {
case 1: cx=468;cy=239; break; case 18: cx=468;cy=239; break;
case 2: cx=464;cy=242; break; case 17: cx=464;cy=242; break;
case 3: cx=459;cy=245; break; case 16: cx=459;cy=245; break;
case 4: cx=455;cy=248; break; case 15: cx=455;cy=248; break;
case 5: cx=450;cy=251; break; case 14: cx=450;cy=251; break;
case 6: cx=446;cy=254; break; case 13: cx=446;cy=254; break;
case 7: cx=441;cy=257; break; case 12: cx=441;cy=257; break;
case 8: cx=437;cy=260; break; case 11: cx=437;cy=260; break;
case 9: cx=432;cy=263; break; case 10: cx=432;cy=263; break;
}



Si num est égal à 10, il ne sera pas attribué à cx 432 et cy 263.
Si je rajoute les if suivants, ça marche :



if (num==10) num=2229;
switch (num) {
case 1: cx=468;cy=239; break; case 18: cx=468;cy=239; break;
case 2: cx=464;cy=242; break; case 17: cx=464;cy=242; break;
case 3: cx=459;cy=245; break; case 16: cx=459;cy=245; break;
case 4: cx=455;cy=248; break; case 15: cx=455;cy=248; break;
case 5: cx=450;cy=251; break; case 14: cx=450;cy=251; break;
case 6: cx=446;cy=254; break; case 13: cx=446;cy=254; break;
case 7: cx=441;cy=257; break; case 12: cx=441;cy=257; break;
case 8: cx=437;cy=260; break; case 11: cx=437;cy=260; break;
case 9: cx=432;cy=263; break; case 2229: cx=432;cy=263; break;
}

if (num==2229) num=10;

Bizarre, non ?

Thierry

7 réponses

Avatar
O.L.
ecm a émis l'idée suivante :
Etrangeté rencontrée quant au résultat fournit par le code suivant :


switch (num) {
case 1: cxF8;cy#9; break; case 18: cxF8;cy#9; break;
case 2: cxF4;cy$2; break; case 17: cxF4;cy$2; break;
case 3: cxE9;cy$5; break; case 16: cxE9;cy$5; break;
case 4: cxE5;cy$8; break; case 15: cxE5;cy$8; break;
case 5: cxE0;cy%1; break; case 14: cxE0;cy%1; break;
case 6: cxD6;cy%4; break; case 13: cxD6;cy%4; break;
case 7: cxD1;cy%7; break; case 12: cxD1;cy%7; break;
case 8: cxC7;cy&0; break; case 11: cxC7;cy&0; break;
case 9: cxC2;cy&3; break; case 10: cxC2;cy&3; break;
}



Si num est égal à 10, il ne sera pas attribué à cx 432 et cy 263.


Chez moi ce code marche très bien, et les valeurs 432 et 263 sont bien
attribuées à cx et cy !

@+

--
Olivier Ligny
Créateur web free-lance / www.cyber-tamtam.net

Avatar
Cenekemoi
Salut,

Etrangeté rencontrée quant au résultat fournit par le code suivant :


switch (num) {
case 1: cxF8;cy#9; break; case 18: cxF8;cy#9; break;
case 2: cxF4;cy$2; break; case 17: cxF4;cy$2; break;
case 3: cxE9;cy$5; break; case 16: cxE9;cy$5; break;
case 4: cxE5;cy$8; break; case 15: cxE5;cy$8; break;
case 5: cxE0;cy%1; break; case 14: cxE0;cy%1; break;
case 6: cxD6;cy%4; break; case 13: cxD6;cy%4; break;
case 7: cxD1;cy%7; break; case 12: cxD1;cy%7; break;
case 8: cxC7;cy&0; break; case 11: cxC7;cy&0; break;
case 9: cxC2;cy&3; break; case 10: cxC2;cy&3; break;
}
(...)

Bizarre, non ?


oui, chez moi, ça marche (xp, ie6)

Essaie en ajoutant le cas "par défaut" :
...
case 9: cxC2;cy&3; break; case 10: cxC2;cy&3; break;
default: cx=0;cy=0; ;
}

--
Cordialement, Thierry (aussi ;-)

Avatar
ecm.mec
O.L. wrote:

Chez moi ce code marche très bien, et les valeurs 432 et 263 sont bien
attribuées à cx et cy !


Je me suis aperçu qu'en fait, il interprétait parfois "10" et parfois
10...

Je suis obligé de faire ça :

case "10": cxC2;cy&3; break;
case 10: cxC2;cy&3; break;

Si je fais :

num=parseFloat(num)

Ca corrige le problème.

Ouf !

Thierry

Avatar
YD
Je me suis aperçu qu'en fait, il interprétait parfois "10" et parfois
10...


J'allais poster mais tu as résolu ton problème trop vite ;-)
Le 'switch' n'effectue pas une comparaison == mais une === ! En clair il
faut, pour que le 'case' corresponde, que la valeur et le type des
arguments soient les mêmes, et si des objets sont comparés que les deux
soient des références du même objet ! (voir 12.11 et 11.9.6 de ECMA-262)

Je suis obligé de faire ça :
case "10": cxC2;cy&3; break;
case 10: cxC2;cy&3; break;
Si je fais :
num=parseFloat(num)
Ca corrige le problème.


J'allais te suggérer de préparer ta valeur de comparaison pour qu'elle soit
bien du type attendu (une valeur numérique) en écrivant :

switch (+num)

--
Y.D.

Avatar
loiseauthierry
YD wrote:

J'allais poster mais tu as résolu ton problème trop vite ;-)
Le 'switch' n'effectue pas une comparaison == mais une === !


< là, je suis resté sur ma faim

Thierry

Avatar
YD
YD wrote:


J'allais poster mais tu as résolu ton problème trop vite ;-)
Le 'switch' n'effectue pas une comparaison == mais une === !



là, je suis resté sur ma faim

Tu veux des explications supplémentaires si je comprends bien.

a == b compare les valeurs de a et b en effectuant éventuellement
un transtypage 10 == '10' renverra true.

a === b (comparaison stricte) vérifie d'abord que le type des
arguments est le même, renvoie false si ce n'est pas le cas
10 === '10' renvoie false car valeur numérique non identique à
valeur chaîne de caractères alors que '10' === ('1' + '0')
renvoie true. De plus si a et b sont des objets, a === b ne
renverra true que si a et b se réfèrent au même objet et ne
cherchera pas si les objets disposent d'une propriété toString()
(ou autre valeur par défaut) pour comparer cette valeur.

Pour chacune de ces comparaisons existent sa négation
a == b donne a != b
a === b donne a !== b

La norme (ECMA-262 3e éd.) stipule que c'est la comparaison
stricte qui est utilisée pour un switch.

Voilà !

--
Y.D.


Avatar
loiseauthierry
YD wrote:

J'allais poster mais tu as résolu ton problème trop vite ;-)
Le 'switch' n'effectue pas une comparaison == mais une === !


là, je suis resté sur ma faim


Tu veux des explications supplémentaires si je comprends bien.

a == b compare les valeurs de a et b en effectuant éventuellement
un transtypage 10 == '10' renverra true.

a === b (comparaison stricte)
(...)


J'avais mal lu et n'avais pas percuté que tu avais écrit 3 '='
:-/

La norme (ECMA-262 3e éd.) stipule que c'est la comparaison
stricte qui est utilisée pour un switch.


Et bien, merci beaucoup pour cette info !

A bientôt et passe de bonnes fêtes

Thierry