IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Probléme avec l'énumération [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut Probléme avec l'énumération
    Bonjour à tous,

    Je solicite un peu d'aide pour le problème suivant :
    Soit l’énumération suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <Flags()> Public Enum NomDuJour As Integer
            Dimanche = 0
            Lundi = 1
            Mardi = 2
            Mercredi = 3
            Jeudi = 4
            Vendredi = 5
            Samedi = 6
            Semaine = Lundi Or Mardi Or Jeudi
            WeekEnd = Samedi Or Dimanche
           Tous = Semaine Or Mercredi Or Vendredi Or WeekEnd
        End Enum
     
    Dim MaJournee as NomDuJour = NomDuJour.Dimanche
    Je souhaiterais savoir comment faire pour que lors du test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if MaJournee = NomDuJour.WeekEnd then .....
    Celui-ci me retourne VRAI. Car Dimanche est bien un weekend. Actuellement cela ne fonctionne que pour Samedi, et lors que je met AND au lieu de OR, il indique pour tous les jours de la semaine. Avec HasFlag, il me retourne False pour Dimanche également.

    Dans l'attente d'une réponse je vous remercie tous....

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Il faut plutôt vérifier si l'enum WeekEnd contient la valeur souhaitée :
    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    If NomDuJour.WeekEnd.HasFlag(MaJournee) Then
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Le problème à la base c'est de vouloir utiliser l'attributs Flags donc une énumération dont certaines valeurs sont combinées (soit directement dans l'énumération soit par code genre Mardi Or Mercredi) sans utiliser des puissances de 2 comme valeurs (alors que la combinaison se fait grâce à des opérateurs "bitwise")
    Et pourtant c'est bien indiqué dans la documentation:
    Définissez des constantes d'énumération à la puissance deux, soit 1, 2, 4, 8, et ainsi de suite. Cela signifie que les indicateurs individuels inclus dans des constantes d'énumération combinées ne se chevauchent pas.
    Prenons l'énumération telle qu'elle est définie actuellement et utilisons le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each ndj As NomDuJour In [Enum].GetValues(GetType(NomDuJour))
        Console.WriteLine(ndj.ToString & " " & ndj)
    Next
    Rien de bien sorcier, on parcourt juste les valeurs de l'énumération et on affiche pour chacune d'elle côte à côte sa représentation textuelle et as valeur numérique, et voici ce que l'on obtient :
    Dimanche 0
    Lundi 1
    Mardi 2
    Mercredi 3
    Jeudi 4
    Vendredi 5
    WeekEnd 6
    WeekEnd 6
    Tous 7
    Tous 7
    On constate que Samedi et Semaine ont "disparus" et que WeekEnd et Tous sont en double comment cela se fait-il ? c'est la conséquence du chevauchement évoqué plus haut.
    Si on calcule Samedi = 6 et WeekEnd = Samedi Or Dimanche = 6 Or 0 = 6 ; ils ont tous les 2 la même valeur
    De même, Semaine = Lundi Or Mardi Or Jeudi = 1 Or 2 Or 4 = 7 et Tous = Semaine Or Mercredi Or Vendredi Or WeekEnd = 7 Or 3 Or 5 Or 6 = 7 ; ils ont tous les 2 la même valeur également
    Il faut bien garder en tête qu'une énumération ce n'est rien de plus qu'un nombre auquel on a donné un "joli nom" ; sauf qu'ici tu donnes plusieurs noms au même nombre donc il en choisit un (a priori de manière arbitraire, mais je soupçonne l'implémentation actuelle de toujours donner le dernier "nom" associé à une valeur)

    Comment résout-on ceci ?
    En suivant les indications fournies par la documentation, à savoir en utilisant des puissances de 2 successives, de sorte à pouvoir combiner les valeurs sans chevauchement (attention aussi au 0, on l'utilise plus pour signifier Aucun car il n'a aucun impact au niveau des calculs quand on le combine)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Flags()> Public Enum NomDuJour As Integer
        Dimanche = 1 ' on commence à 1
        Lundi = 2 ' puissance de 2 successives
        Mardi = 4
        Mercredi = 8
        Jeudi = 16
        Vendredi = 32
        Samedi = 64
        Semaine = Lundi Or Mardi Or Jeudi
        WeekEnd = Samedi Or Dimanche
        Tous = Semaine Or Mercredi Or Vendredi Or WeekEnd
    End Enum
    Et avec ceci si je réutilise l'extrait de code mentionné plus haut j'obtiens désormais :
    Dimanche 1
    Lundi 2
    Mardi 4
    Mercredi 8
    Jeudi 16
    Semaine 22
    Vendredi 32
    Samedi 64
    WeekEnd 65
    Tous 127
    Et tout est bien qui finit bien
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 134
    Points : 69
    Points
    69
    Par défaut
    Ok, je vous remercie pour votre aide... J'ai réussi à faire ce que je voulais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec énumération
    Par tonytrua dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 21/05/2012, 10h39
  2. problème avec l'énumération
    Par lesud13 dans le forum 4D
    Réponses: 3
    Dernier message: 01/10/2009, 15h42
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo