C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

de l'utilisation d'enum pour des masques

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
meow
Guest





PostPosted: Fri Sep 23, 2005 7:53 am    Post subject: de l'utilisation d'enum pour des masques Reply with quote



Bonjour,

Je suis en train de coder une petite bibliothèque pour gérer des
streams au format .kin (kinemages). Il s'agit d'un format de fichier
destiné à la description d'objets 3D simples tels que les segments
les triangles, etc.

J'aimerai pouvoir gérer un mode d'affichage (fil de fer / plein /
points / ...) sur mes streams, et tant qu'à faire, autoriser un choix
multiple. Me sentant malin, dans ma classe kin_stream je définis donc
un

enum mode_type{ WIRED=1, PLAIN=2, DOTTED=4, ORIENT=8, NORMALS=16 };

Si mes souvenirs sont bons, C garantit que pour une variable enum il
sera donné assez de place pour stocker une valeur entière de la
taille de la puissance de 2 supérieure à la plus grande valeur
stockée dans l'enum. Les opérateurs | et & sont en outre valides...
Or en C++ le compilo me cherche des noises parce que enum n'apprécie
plus ces opérateur... de fait, je suis obligé de caster explicitement
mes expressions :

(mode_type)(GRID | PLAIN)
[*]

Ce qui me semble enlever un peu de souplesse en ce sens que j'aimerai
donner accès uniquement aux constantes (GRID,PLAIN,...) et que leur
type ne devrait pas à etre connu de l'utilisateur.

Que faire ? utiliser des defines ? ecrire une classe mod_type dans
laquelle définir les operateurs logiques ? C'est y pas un peu trop
bourrin ?

[*](j'ai cru comprendre qu'en C++ on est plus sensé faire ce genre de
casts à la C, qu'il y avait 4 operateur de cast à utiliser en place
de cela... Mais je n'ai pas encore pris le temps de me plonger dans ces
subtilité.)

Back to top
kanze
Guest





PostPosted: Fri Sep 23, 2005 12:50 pm    Post subject: Re: de l'utilisation d'enum pour des masques Reply with quote



meow wrote:

Quote:
Je suis en train de coder une petite bibliothèque pour
gérer des streams au format .kin (kinemages). Il s'agit d'un
format de fichier destiné à la description d'objets 3D simples
tels que les segments les triangles, etc.

J'aimerai pouvoir gérer un mode d'affichage (fil de fer /
plein / points / ...) sur mes streams, et tant qu'à faire,
autoriser un choix multiple. Me sentant malin, dans ma classe
kin_stream je définis donc un

enum mode_type{ WIRED=1, PLAIN=2, DOTTED=4, ORIENT=8, NORMALS=16 };

Si mes souvenirs sont bons, C garantit que pour une variable
enum il sera donné assez de place pour stocker une valeur
entière de la taille de la puissance de 2 supérieure à la plus
grande valeur stockée dans l'enum.

Oui.

Quote:
Les opérateurs | et & sont en outre valides...

Non. Ou plutôt, ils sont valides parce qu'il y a une promotion
en int.

Quote:
Or en C++ le compilo me cherche des noises parce que enum
n'apprécie plus ces opérateur... de fait, je suis obligé de
caster explicitement mes expressions :

(mode_type)(GRID | PLAIN)

Tout à fait. Le résultat de GRID | PLAIN a le type int, et il
n'y a pas de conversion implicite d'in en un enum.

Quote:
Ce qui me semble enlever un peu de souplesse en ce sens que
j'aimerai donner accès uniquement aux constantes
(GRID,PLAIN,...) et que leur type ne devrait pas à etre connu
de l'utilisateur.

Que faire ? utiliser des defines ? ecrire une classe mod_type
dans laquelle définir les operateurs logiques ? C'est y pas un
peu trop bourrin ?

Définir les opérateurs voulus :

mode_type
operator|( mode_type lhs, mode_type rhs )
{
return (mode_type)((unsigned)lhs | (unsigned)rhs ) ;
}

et la même chose pour &, si tu en as besoin.

Quote:
[*](j'ai cru comprendre qu'en C++ on est plus sensé faire ce
genre de casts à la C, qu'il y avait 4 operateur de cast à
utiliser en place de cela... Mais je n'ai pas encore pris le
temps de me plonger dans ces subtilité.)

C'est une question de style. Pour des conversions de pointeur ou
de référence, oui ; je dirais que les nouveaux casts s'imposent.
Ici, en revanche, c'est vraiment une question de goût.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
meow
Guest





PostPosted: Fri Sep 23, 2005 1:50 pm    Post subject: Re: de l'utilisation d'enum pour des masques Reply with quote



Ok... En meme temps c'est vrai que ça semble évident une fois
ennoncé.
Merci.

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.