Bonjour,
Peut-on faire un switch avec 2 conditions ?
Et comment on déclare les Case ?
Merci de votre aide
A+
Bonjour,
Peut-on faire un switch avec 2 conditions ?
Et comment on déclare les Case ?
Merci de votre aide
A+
Bonjour,
peux-tu être plus précis s'il te plait ? Qu'est-ce que tu entends par "deux conditions" ? Merci.
non pas possible.Envoyé par NESTLE
Par contre :
-> les switch peuvent être remplacés par une bonne conception à base de polymporphisme !!!
Donc oui, c'est faisable!
Salut,
L'une des solutions les plus facile consiste a, si possible, regrouper les deux valeurs de manières à ce qu'elles n'en fassent plus qu'une...
Pour y arriver, il "suffit" de décaler suffisemment "vers la gauche" (en fait, vers le bit de poids fort) la valeur d'une des variable de manière à ce que l'ajout de l'autre ne puisse plus modifier la valeur de la premiere et d'écrire les cas pour chacune des possiblités obtenues...
Je m'explique:
Imaginons que tu veuille effectuer un switch sur les variables a et b, toutes deux déclarées en tant que int, et ayant toutes deux une valeur potentielles comprise entre 0 et 7...
Tu as donc une représentation binaire de l'ordre de
Comme tu peux le remarquer, le premier bit qui n'est pas utilisé pour l'instant, c'est le quatrieme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 0 -> 0000 1 -> 0001 2 -> 0010 3 -> 0011 4 -> 0100 5 -> 0101 6 -> 0110 7 -> 0111
Hé bien, il "suffit" de décaler la valeur d'une des variables de 3 bits...
on pourra apres faire l'addition de a et de b sans perdre l'une des possibilités:
Maintenant, il ne te reste plus qu'à adapter cet exemple à ton cas personnel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 int finale=a;// j'utilise finale pour ne pas modifier a ;) finale<<3; // décalage de trois bits vers la gauche de la valeur de finale //(qui était jusqu'à présent la meme que a ;) ) // En fait, cela revient à multiplier par 8 :D finale+=b; // on ajoute la valeur de b à finale... // on est sur de ne pas avoir perdu un seul bit de a du fait que // le premier bit utilisé pour a se trouve apres le dernier bit // utilisé pour b :D switch (finale) { case 0: /*a et b valent 0 */ break; case 1: /*a vaut 0 et b vaut 1 */ break; /* ... */ case 7: /*a vaut 0 et b vaut 7 */ break; case 8: /*a vaut 1 et b vaut 0 */ break; /* ... */ case 15: /*a vaut 1 et b vaut 7 */ break; case 16: /*a vaut 2 et b vaut 0 */ break; /* ... */ case 23: /*a vaut 2 et b vaut 7 */ break; /* ... */ case case 56: /* a vaut 7 et b vaut 0 */ break; /* ... */ case 63 /* a vaut 7 et b vaut 7 */ break; }![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
En faintant :Envoyé par NESTLE
Tu crée une structure contenant tes 2 types d'éléments, et tu fais un switch de cette structure.
Solution de faciliter qui te prend 3-4 lignes de codes![]()
Je dois admettre que c'est bien penséEnvoyé par koala01
![]()
Mais c'est quand même tordu à souhait ton truc !!![]()
Pourquoi tordu à souhaitEnvoyé par poukill
![]()
C'est juste une application sensée de la représentation de n'importe quelle valeur en mémoire![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Pas si tordu que ça, de manière générale c'est très pratique lorsque l'on doit avoir un bloc d'instruction différent par combinaison de variables. Disons que c'est surtout utilisé avec des combinaisons de bits, plutôt que des combinaisons d'entiers.Envoyé par poukill
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int collision = (collision_gauche << 3) & (collision_droite << 2) & (collision_haut << 1) & (collision_bas << 0); switch (collision) { case 0 : // pas de collision case 1 : // collision haut case 2 : // collision bas case 3 : // collision haut + bas ... case 15 : // collision de tous les côtés }
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
PP(Team) :Sauf qu'on ne peut pas faire un switch sur une structure ou sur un tableauEn faintant :
Tu crée une structure contenant tes 2 types d'éléments, et tu fais un switch de cette structure.
Solution de faciliter qui te prend 3-4 lignes de codes
Merci laurent d'abonder en mon sens...
D'autant plus que, en définitive, ca prend beaucoup moins de temps à mettre au point qu'à en expliquer le principe![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Ben c'est cool, je viens d'apprendre un trucEnvoyé par diogene
.
Même si j'avais déjà eu le cas il y a quelques temps...
Oui j'ai pas dit que c'était débile du tout... D'ailleurs Koala je ne me souviens pas avoir vu de remarques infondées de ta part!!!Envoyé par Laurent Gomila
![]()
De plus, il est vrai qu'ayant déjà codé des protocoles de transmissions, j'aurai du me rappeler que c'était une technique pratique.
Mais c'est vrai que c'est surtout utilisé en binaire (vrai ou faux)
Mais comme l'a fait remarquer Koala, ça marche aussi avec des nombres plus grands...Ca j'y avais jamais pensé... ^^
Personne n'a jamais pris ton intervention dans le sens de "c'est débile" (en tout cas, ce n'est pas mon cas)...
Simplement, le fait est que "solution tordue", ca prend cette consonnance quelque peu péjorative de "solution tordue, tout droit sortie de l'esprit torturé de quelqu'un", ce qui est de nature à faire douter de ma santé mentale
Et je peux te rassurer entièrement: ma santé mentale se porte à merveille
C'est pourquoi, je préferes l'utilisation de termes proches deadmirable mise en oeuvre de la logique d'implémentation en tenant compte des particularités induites par la représentation binaire des valeurs(bon, là, j'avoue, j'en fais peut etre un peu trop...
)
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Ceci dit, j'avoue, apres réflexion, que la solution est un peu (mais pas à souhait,quand meme![]()
![]()
) tordue dans le sens ou le décalage de bits n'est meme pas nécessaire...
Il "suffit" de multiplier la valeur d'une des variable par la valeur maximale envisagée pour l'autre +1:
- si bmax=10 finale=(a*11)+b
- si bmax=16 finale=(a*17)+b
- si bmax=3 finale=(a*4)+b
- ...
Le code devient donc:
et sans oublier le fait que l'on n'est absolument pas obligé de prévoir tous les cas: on a encore la valeur default disponible, si certaines valeurs réagissent de manière similaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 //on considère que les valeurs possible sont de 0 à 9 inclus pour a et pour b int finale=a*10+b; /*sinon, de manière générale, ca prend la forme de finale=a*(bmax+1)+b ou bmax est la valeur maximale envisagée pour b ;) */ switch (finale) { case 0: /*a et b valent 0 */ break; case 1: /*a vaut 0 et b vaut 1 */ break; /* ... */ case 9: /*a vaut 0 et b vaut 9 */ break; case 10: /*a vaut 1 et b vaut 0 */ break; /* ... */ case 19: /*a vaut 1 et b vaut 9 */ break; case 20: /*a vaut 2 et b vaut 0 */ break; /* ... */ case 27: /*a vaut 2 et b vaut 7 */ break; /* ... */ case case 56: /* a vaut 5 et b vaut 6 */ break; /* ... */ case 99: /* a vaut 9 et b vaut 9 soit la derniere possibilité */ break; }![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Bien sûr! L'idée est toujours la même: faire tenir plusieurs informations dans la même donnée!![]()
Ben oui, mais, si tu veux arriver à tester l'ensemble des possibilités fournies par deux variables avec des switch...case, tu n'a pas beaucoup d'autre choix pour y arriverEnvoyé par poukill
...
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Merci
A Tous pour vos infos
Etant donne le peu de possiblite de mon switch : 2 valeurs par condition
J'ai finalement opté pour un if else if ...
A+
NESTLE
mdr, c'est clair qu'un switch avec uniquement 2 conditions, ca ne sert à rien, mais bon.....au moins tu t'en est apercu.Envoyé par NESTLE
lolEnvoyé par NESTLE
C'était bien la peine de trouver une méthode élégante...![]()
Partager