| 
					Sujet : [language C] je trouve pas mon erreur avec le switch | 
			
				| Musaran | 
				Il manquait effectivement un break.
 glutPostRedisplay est sytématiquement appelée, autant la sortir du switch.
 'D' est de type char. key est de type unsigned char. Les comparer est risqué... T'es fâché avec les comparaisons ?
   Et puis ça fait pas de mal d'aligner les instructions semblables.Code :
 - #include <ctype.h>
 - #include <float.h>
 - const float tolerance= 64*FLT_EPSILON ;//*0.0000001192092896 (float de 4 octets)
 - float c= 0.0 ;
 - 
 - int fnear(float arg1, float arg2){
 - 	float diff= arg1>arg2 ? arg1-arg2 : arg2-arg1 ;//différence absolue
 - 	return diff<tolerance ;
 - }
 - 
 - void keyboard (char key, int x, int y){
 - 	switch (toupper(key)){
 - 	case 'D':nbr_degre+= 2.0; j=  0.0; k=  1.0; l= 0.0; break;//rotation Y
 - 	case 'S':nbr_degre+= 2.0; j=  0.0; k= -1.0; l= 0.0; break;//rotation Y
 - 	case 'E':nbr_degre+= 2.0; j= -1.0; k=  0.0; l= 0.0; break;//rotation X
 - 	case 'X':nbr_degre+= 2.0; j=  1.0; k=  0.0; l= 0.0; break;//rotation X
 - 	case 'O':c -= 0.5 ;                                 break;
 - 	case 'I':c += 0.5 ;
 -        if(fnear(c,10)){profondeur= 1; }
 -   else if(fnear(c,20)){profondeur= 2; }
 -   else if(fnear(c,30)){profondeur= 3; }
 -   else if(fnear(c,40)){profondeur= 4; }
 -   //if(c>10-tolerance && c<40+tolerance) profondeur= (int)c/10 ;
 - 	                                                    break;//manquait, optionnel maintenant
 - 	}
 - 	glutPostRedisplay() ;
 - }
 
  |  
 Rassures-moi: il y a une raison pour que la ligne en commentaire ne fasse pas l'affaire ?    | 
			
			
					
						| Musaran | 
			Le switch du C++ requiert une valeur entière: enum, bool, char, short, int, long...
 Mêmes les pointeurs et type_info sont interdits.
 Qui plus est, les case requièrent des constantes vraies, c-a-d connues à la compilation.
  
 gilou a écrit a écrit  :
  case 1/3: n'est pas acceptable en C, car 1/3 est une expression a evaluer et non pas une constante.
 
 
  |  
 Tous les termes étant constants, c'est une expression constante évaluée à la compilation, donc c'est acceptable.
 Par contre attention: 1/3 vaut 0 ! Puisque les opérandes sont entiers, le résultat l'est aussi (troncage).
   Les flottants ne sont pas exacts.
 1.0/3.0 vaut 0.333..., qui *3 vaut 0.999... !
 Normal que le swich les refuses, puisqu'il fait un test d'égalité.
 A titre d'exemple, ceci : Code :
 - if(1.0/3.0 == 1.0/3.0)
 - 	cout << "berk !\n" ;
 
  |  
 affiche "berk !" chez moi, sans que je saches pourquoi !
   Reste plus qu'a simuler un switch étendu avec if-else: Code :
 - switch(z){
 - 	case a : /*a*/      ; break ;
 - 	case b : /*b*/
 - 	case c : /*c*/      ; break ;
 - 	default: /*default*/; break ;
 - }
 - if     (z==a){      /*a*/            ;}
 - else if(z==b){      /*b*/;goto tagc  ;}
 - else if(z==c){tagc: /*c*/            ;}
 - else         {      /*default*/      ;}
 
  |  
 Avantage: le test peut être plus complexe qu'une simple égalité.
 Inconvénient: le break est implicite.    |