je trouve pas mon erreur avec le switch [language C] - Programmation
Marsh Posté le 03-08-2002 à 19:51:04
Tu peux expliquer en quoi ça ne marche pas exctement ?
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
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.
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
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 ?
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 ?
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é.
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
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+,
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 %.
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.
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 :
|
Ca me semble pas pas tip top.
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
|
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+,
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
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
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+,
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.
Marsh Posté le 04-08-2002 à 16:19:25
eheh la solution a tous vos problemes:
Code :
|
A+
LeGreg
Marsh Posté le 04-08-2002 à 16:22:26
legreg a écrit a écrit : eheh la solution a tous vos problemes |
SpaDansLaNorme
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
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+,
Marsh Posté le 05-08-2002 à 02:20:05
legreg a écrit a écrit : eheh la solution a tous vos problemes:
|
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+,
Marsh Posté le 05-08-2002 à 12:11:44
airseb a écrit a écrit : c bon je l'ai fait avec un if |
if (c == 3.0) ? Fait gaffe, tu n'a fait que deplacer le problème.
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.
Marsh Posté le 08-08-2002 à 20:33:47
airseb a écrit a écrit : ça marche bien |
tetu, obstiné, et incrédule ... (un peu bete aussi )
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 :
|
affiche "berk !" chez moi, sans que je saches pourquoi !
Reste plus qu'a simuler un switch étendu avec if-else:
Code :
|
Avantage: le test peut être plus complexe qu'une simple égalité.
Inconvénient: le break est implicite.
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.
Marsh Posté le 09-08-2002 à 11:13:30
musaran a écrit a écrit : A titre d'exemple, ceci :
affiche "berk !" chez moi, sans que je saches pourquoi ! |
Et qu'affiche ceci ? :
Code :
|
Marsh Posté le 10-08-2002 à 02:28:21
J'ai bêtement écrit a écrit :
affiche "berk !" chez moi, sans que je saches pourquoi ! |
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.
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 :
|
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
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 :
|
Rassures-moi: il y a une raison pour que la ligne en commentaire ne fasse pas l'affaire ?
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 ;
}
}