[language C] je trouve pas mon erreur avec le switch

je trouve pas mon erreur avec le switch [language C] - Programmation

Marsh Posté le 03-08-2002 à 19:48:10    

ya un peu d'open gl mais l'erreur est pas là.
 
float c = 0.0 ;
 
 
void keyboard (unsigned char key, int x, int y)
{
 
 
 
switch (key)  
{
case 'd' : //fait tourner selon l'axe des Y
case 'D' :
 
nbr_degre += 2.0;  
j = 0.0 ;
k = 1.0 ;
l = 0.0 ;
glutPostRedisplay () ;
break ;
 
case 's' :
case 'S' :
 
nbr_degre += 2.0; //fait tourner selon l'axe des Y
j = 0.0 ;
k = -1.0 ;
l = 0.0 ;
glutPostRedisplay () ;
break ;
 
case 'e' : //fait tourner selon l'axe des X
case 'E' :
 
nbr_degre += 2.0;
j = -1.0 ;
k = 0.0 ;
l = 0.0 ;
glutPostRedisplay () ;
break ;
 
case 'x' : //fait tourner selon l'axe des X
case 'X' :
 
nbr_degre += 2.0;
j = 1.0 ;
k = 0.0 ;
l = 0.0 ;
glutPostRedisplay () ;
break ;
 
case 'i':
case 'I':
 
c += 0.5 ;
switch (c)  
{
 case 10.0 :
 profondeur = 1 ;
 glutPostRedisplay () ;
 break ;
 
 case 20.0 :
 profondeur = 2 ;
 glutPostRedisplay () ;
 break ;
 
 case 30.0 :
 profondeur = 3 ;
 glutPostRedisplay () ;
 break ;
 
 case 40.0 :
 profondeur = 4 ;
 glutPostRedisplay () ;
 break ;
}
 
 
 
case 'o':
case 'O':
 
c -= 0.5 ;
glutPostRedisplay () ;
break ;
 
 
}
}
 

Reply

Marsh Posté le 03-08-2002 à 19:48:10   

Reply

Marsh Posté le 03-08-2002 à 19:51:04    

Tu peux expliquer en quoi ça ne marche pas exctement ?


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 03-08-2002 à 19:51:38    

j'ai cette erreur là :
 
error C2450: switch expression of type 'float' is illegal
        Integral expression required

Reply

Marsh Posté le 03-08-2002 à 19:52:31    

airseb a écrit a écrit :

j'ai cette erreur là :
 
error C2450: switch expression of type 'float' is illegal
        Integral expression required


Ça me paraît clair : tu fais un switch(c), et c est un flottant.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 03-08-2002 à 19:52:51    

airseb a écrit a écrit :

j'ai cette erreur là :
 
error C2450: switch expression of type 'float' is illegal
        Integral expression required




 
Ben le message est clair, non ?
 
Edit: grillé de 20 secondes


Message édité par lorill le 03-08-2002 à 19:53:15
Reply

Marsh Posté le 03-08-2002 à 19:54:51    

on a pas le droit de faire un switch avec un flottant ?
c absurde ! pourquoi on aurais pas le droit ?


Message édité par airseb le 03-08-2002 à 19:55:23
Reply

Marsh Posté le 03-08-2002 à 19:57:17    

airseb a écrit a écrit :

on a pas le droit de faire un switch avec un flottant ?
c absurde ! pourquoi on aurais pas le droit ?


Réfléchis un peu : qu'est-ce qu'un flottant ?


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 03-08-2002 à 19:57:42    

airseb a écrit a écrit :

on a pas le droit de faire un switch avec un flottant ?
c absurde ! pourquoi on aurais pas le droit ?




 
parce que C2450. Je suis sur qu'en cherchant dans la norme ca doit etre expliqué.

Reply

Marsh Posté le 03-08-2002 à 20:00:32    

Jar Jar a écrit a écrit :

Réfléchis un peu : qu'est-ce qu'un flottant ?




 
 je sais c un nombre à virgule  :o  :D

Reply

Marsh Posté le 03-08-2002 à 20:36:17    

Jar Jar a écrit a écrit :

Ça me paraît clair : tu fais un switch(c), et c est un flottant.




Ben sauf que je viens de relire la spec, et je ne vois rien en C ou C++ qui s'oppose a l'utilisation de flottants dans ce cas.
Plutot une limitation du compilateur qu'il utilise, je pense.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-08-2002 à 20:36:17   

Reply

Marsh Posté le 03-08-2002 à 20:40:45    

gilou a écrit a écrit :

Ben sauf que je viens de relire la spec, et je ne vois rien en C ou C++ qui s'oppose a l'utilisation de flottants dans ce cas.
Plutot une limitation du compilateur qu'il utilise, je pense.


En tout cas gcc n'en veut pas non plus, et je crois pourtant qu'il respecte la norme ISO C à 100 %.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 03-08-2002 à 20:46:22    

Mais c'est vrai que je n'ai trouvé nulle part référence à cette impossibilité.
Ceci dit, la norme IEEE pour les flottants rend leur utilisation dans un switch complètement inappropriée.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 04-08-2002 à 01:21:51    

Oui enfin, c'est logique aussi. Un nombre flottant, c'est par définition une valeur approximative. Du coup, on peut pas "sérieusement" écrire float1 == float2...D'ailleurs Ada 83 (ahah oui!! old school les amis), ne l'accepte pas comme ca! :)
Donc dans un switch où on ecrirait

Code :
  1. switch (c) {
  2.    case 1/3:
  3.    ....
  4. }


Ca me semble pas pas tip top.


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 04-08-2002 à 04:46:44    

Willyzekid a écrit a écrit :

Oui enfin, c'est logique aussi. Un nombre flottant, c'est par définition une valeur approximative. Du coup, on peut pas "sérieusement" écrire float1 == float2...D'ailleurs Ada 83 (ahah oui!! old school les amis), ne l'accepte pas comme ca! :)
Donc dans un switch où on ecrirait

Code :
  1. switch (c) {
  2.    case 1/3:
  3.    ....
  4. }


Ca me semble pas pas tip top.




Euh non.
Un nombre flottant n'est pas une expression approximative lorsqu'on travaille en C, justement etant donné le fait qu'on emploie le standard IEEE pour le representer.
d'autre part,  
case 1/3: n'est pas acceptable en C, car 1/3 est une expression a evaluer et non pas une constante.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-08-2002 à 11:25:24    

gilou a écrit a écrit :

 
Ben sauf que je viens de relire la spec, et je ne vois rien en C ou C++ qui s'oppose a l'utilisation de flottants dans ce cas.
Plutot une limitation du compilateur qu'il utilise, je pense.
A+,




Si

The condition shall be of integral type, enumeration  type,  or  of  a
  class  type for which a single conversion function to integral or enu-
  meration type exists (_class.conv_).

http://www.comnets.rwth-aachen.de/doc/c++std/stmt.html

Reply

Marsh Posté le 04-08-2002 à 12:05:33    

ben ca parait logique... si t'as un
 
 double Bidule;
 
tu fais jamais  
 
if (Bidule == 0)
 
mais if (Bidule < TOLERANCE)
 
avec la valeur absolue

Reply

Marsh Posté le 04-08-2002 à 13:03:35    

Verdoux a écrit a écrit :

 
Si

The condition shall be of integral type, enumeration  type,  or  of  a
  class  type for which a single conversion function to integral or enu-
  meration type exists (_class.conv_).

http://www.comnets.rwth-aachen.de/doc/c++std/stmt.html




Ptet en C++, mais en C, on demande juste que ce sur quoi porte le switch soit de type numerique.
 
En fait, selon les liens internet que j'ai trouvé, il est dit que ce doit etre un type integral ou non. Je subodore que c'etait pas le cas au depart et que ca a evolué ensuite (ansi-c?) pour ajouter cette condition.
A+,


Message édité par gilou le 04-08-2002 à 13:23:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-08-2002 à 13:53:00    

gilou a écrit a écrit :

 
Ptet en C++, mais en C, on demande juste que ce sur quoi porte le switch soit de type numerique.




 
Pas numérique : scalaire. Un char, un short, un integer, etc.
N'importe quoi qui soit une valeur discrète.
On ne peut pas faire de switch sur des types non-scalaires comme les float, les tableaux, les structs etc.

Reply

Marsh Posté le 04-08-2002 à 16:19:25    

eheh la solution a tous vos problemes:

Code :
  1. switch(FToDw(monfloat)) {
  2. //..
  3. }


 
A+
LeGreg

Reply

Marsh Posté le 04-08-2002 à 16:22:26    

legreg a écrit a écrit :

eheh la solution a tous vos problemes




 
SpaDansLaNorme


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 04-08-2002 à 16:23:30    

Eh Airseb! c'est quoi que tu veux faire avec ton switch(c)?
 
Genre tu peux pas en déduire la profondeur avec la valeur de c?
 
LeGreg
 

Reply

Marsh Posté le 05-08-2002 à 02:17:59    

JyB a écrit a écrit :

 
 
Pas numérique : scalaire. Un char, un short, un integer, etc.
N'importe quoi qui soit une valeur discrète.
On ne peut pas faire de switch sur des types non-scalaires comme les float, les tableaux, les structs etc.




C'est pourquoi j'ai mis le second paragraphe. Mais au depart, j'avais trouvé des sites web ou le type requis etait "numerical" et non pas "integral" dans leur description de la syntaxe du langage C.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-08-2002 à 02:20:05    

legreg a écrit a écrit :

eheh la solution a tous vos problemes:

Code :
  1. switch(FToDw(monfloat)) {
  2. //..
  3. }


 
A+
LeGreg




Oui, ou alors il s'ecrit rapidement une fonction adaptée a son pb qui a un float en entrée et un int en sortie.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-08-2002 à 12:10:34    

c bon je l'ai fait avec un if  :D  :lol:

Reply

Marsh Posté le 05-08-2002 à 12:11:44    

airseb a écrit a écrit :

c bon je l'ai fait avec un if  :D  :lol:  




 
if (c == 3.0) ? Fait gaffe, tu n'a fait que deplacer le problème.
 


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 05-08-2002 à 16:10:30    

ben ça marche  :p

Reply

Marsh Posté le 08-08-2002 à 13:53:01    

airseb a écrit a écrit :

ben ça marche  :p


Mais c'est dépendant de l'implémentation des flottants, et tu vas avoir des bugs qui vont surgir sans comprendre comment.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 08-08-2002 à 20:30:33    

ça marche bien  :sol:

Reply

Marsh Posté le 08-08-2002 à 20:33:47    

airseb a écrit a écrit :

ça marche bien  :sol:  




 
tetu, obstiné, et incrédule ... (un peu bete aussi  :D )

Reply

Marsh Posté le 09-08-2002 à 00:43:30    

:lol:  
 
 :non: nan nan moi yen a pas être bête  :non:

Reply

Marsh Posté le 09-08-2002 à 03:14:25    

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 :
  1. if(1.0/3.0 == 1.0/3.0)
  2. cout << "berk !\n" ;

affiche "berk !" chez moi, sans que je saches pourquoi !
 
Reste plus qu'a simuler un switch étendu avec if-else:

Code :
  1. switch(z){
  2. case a : /*a*/      ; break ;
  3. case b : /*b*/
  4. case c : /*c*/      ; break ;
  5. default: /*default*/; break ;
  6. }
  7. if     (z==a){      /*a*/            ;}
  8. else if(z==b){      /*b*/;goto tagc  ;}
  9. else if(z==c){tagc: /*c*/            ;}
  10. else         {      /*default*/      ;}

Avantage: le test peut être plus complexe qu'une simple égalité.
Inconvénient: le break est implicite.


Message édité par Musaran le 09-08-2002 à 03:15:22

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 09-08-2002 à 08:30:50    

airseb a écrit a écrit :

 :non: nan nan moi yen a pas être bête  :non:


Peut-être, mais tu n'as toujours pas compris pourquoi il ne faut pas faire de tests d'égalité sur des flottants.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 09-08-2002 à 11:13:30    

musaran a écrit a écrit :

 
A titre d'exemple, ceci :

Code :
  1. if(1.0/3.0 == 1.0/3.0)
  2. cout << "berk !\n" ;

affiche "berk !" chez moi, sans que je saches pourquoi !




 
Et qu'affiche ceci ? :
 

Code :
  1. if(3.0/9.0 == 1.0/3.0)
  2. cout << "berk !\n" ;
  3. else
  4. cout << "plop!\n" ;


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 10-08-2002 à 02:28:21    

J'ai bêtement écrit a écrit :

Code :
  1. if(1.0/3.0 == 1.0/3.0)
  2. cout << "berk !\n" ;

affiche "berk !" chez moi, sans que je saches pourquoi !


:o Pour se moquer de moi c'est ici: http://www.presence-pc.com/sqlforu [...] 149&cat=11.
 
Mais ne ne nous dispersons pas et concentrons-nous sur ton problème.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 10-08-2002 à 03:01:47    

Enfin, tu as de la chance parce que 0.5 est un bon candidat pour etre converti en flottant (1.0*2^-1 en binaire).
tu aurais choisi 0.1 ca n'aurait pas ete aussi evident.
 
combien font 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f ?
 

Code :
  1. float t = 0.0f;
  2. for (int i=0; i < 10; ++i) {t+=0.1f};
  3. assert (t == 1.0f)


Mon compilateur n'a pas l'air de savoir tres bien..
 
de toute facon il manque un break dans ton code original.
 
un autre truc: pourquoi tu recalcules profondeur quand tu decrementes c mais pas quand tu l'incrementes?
 
A+
LeGreg

Reply

Marsh Posté le 11-08-2002 à 04:02:16    

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 :
  1. #include <ctype.h>
  2. #include <float.h>
  3. const float tolerance= 64*FLT_EPSILON ;//*0.0000001192092896 (float de 4 octets)
  4. float c= 0.0 ;
  5. int fnear(float arg1, float arg2){
  6. float diff= arg1>arg2 ? arg1-arg2 : arg2-arg1 ;//différence absolue
  7. return diff<tolerance ;
  8. }
  9. void keyboard (char key, int x, int y){
  10. switch (toupper(key)){
  11. case 'D':nbr_degre+= 2.0; j=  0.0; k=  1.0; l= 0.0; break;//rotation Y
  12. case 'S':nbr_degre+= 2.0; j=  0.0; k= -1.0; l= 0.0; break;//rotation Y
  13. case 'E':nbr_degre+= 2.0; j= -1.0; k=  0.0; l= 0.0; break;//rotation X
  14. case 'X':nbr_degre+= 2.0; j=  1.0; k=  0.0; l= 0.0; break;//rotation X
  15. case 'O':c -= 0.5 ;                                 break;
  16. case 'I':c += 0.5 ;
  17.       if(fnear(c,10)){profondeur= 1; }
  18.  else if(fnear(c,20)){profondeur= 2; }
  19.  else if(fnear(c,30)){profondeur= 3; }
  20.  else if(fnear(c,40)){profondeur= 4; }
  21.  //if(c>10-tolerance && c<40+tolerance) profondeur= (int)c/10 ;
  22.                                                     break;//manquait, optionnel maintenant
  23. }
  24. glutPostRedisplay() ;
  25. }

Rassures-moi: il y a une raison pour que la ligne en commentaire ne fasse pas l'affaire ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed