Utiliser une variable numérique pour mémoriser des valeurs [Résolu]

Signaler
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
-
cs_ghuysmans99
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
-
Bonjour,

J'avais vu dans un code-source (dont j'ai perdu la trace), qu'une personne mémorisait des valeurs dans une variable numérique et j'aimerais en savoir plus.

L'idée est la suivante.  Dans un programme concernant des bâtiments, il faut que j'indique si un bâtiment est destiné à accueillir :
(a) uniquement les membres du personnel ;
(b) du public ;
(c) majoritairement des enfants ;
(d) des personnes à mobilité réduite ;
- etc.

Il est clair que pour certains bâtiments, différentes options sont possible : a+b, c+d, etc.

Comment doit-on s'y prendre pour transformer cela en valeur numérique ?
Si j'ai bonne mémoire, dans le code-source cité ci-dessus), cela donnait des trucs du genre :
"Si dans" MaVariableBatiment se trouve "LaValeurCorrespondant_à_2" et "LaValeurCorrespondant_à_4"..
...alors le bâtiment accueille du public et des personnes à mobilité réduite.

J'espère que mon explication sera suffisamment claire pour obtenir une réponse (toute aussi claire)...

D'avance merci

Programmix

16 réponses

Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
Pas de problème : si tu utilise des nombres dans la série (y = 2^x) tu n'auras jamais de collision.
Evidemment, la taille de la variable change en fonction du nombre d'options :
8 options ou moins : Byte
16 options ou moins : Integer
32 options ou moins : Long
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
Avec un OR, tu peux le faire tant de fois que tu veux cette opération sans risquer de changer d'autres options (dans ton cas) sans le faire exprès.
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Je crois qu'il s'agit là d'une manière de convertir les variables qui était utilisée au temps du DOS...

Programmix
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
64
Salut
Oui, tu as mis le doigt dessus :
Dans la mesure où tu peut avoir entre 1 et 4 réponses indépendantes ou ensemble, il faut donner des valeurs différentes à ces options, en s'appuyant sur la méthode ressemblant au "décimal codé binaire":
   (a)   1
   (b)   2
   (c)   4
   (d)   8
Si (b) et (d) sont cochée, suffit de faire l'addition : Code = 2 + 8
A la relecture de Code :
   Case à cocher (a) = vrai si "Code And 1 > 0"
   Case à cocher (b) = vrai si "Code And 2 > 0"
   Case à cocher (c) = vrai si "Code And 4 > 0"
   Case à cocher (d) = vrai si "Code And 8 > 0"

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Merci pour la réponse, c'est ce que je pensais.

Mais étant encore peu habitué au "décimal code binaire", comment dois-je faire pour monter dans le nombre de variables ?  Est-ce toujours le double du précédent ?

Ce que je crains, c'est d'utiliser un nombre pour une option qui pourrait correspondre à une somme d'autres options.

Programmix
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Ca commence à se préciser et s'éclaircir dans ma tête.

Puis-je abuser en demandant un exemple de code VB6 pour 10 options ?

Programmix
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
J'ai testé cela et cela marche...

Option Explicit

Enum Caract
    travailleur = 1
    dupublic = 2
    enfants = 4
    mobilitereduite = 8
    logement = 16
End Enum

Private Sub Command1_Click()

    Dim i As Integer
   
    If Me.Check1(0) Then i = i + Caract.travailleur
    If Me.Check1(1) Then i = i + Caract.dupublic
    If Me.Check1(2) Then i = i + Caract.enfants
    If Me.Check1(3) Then i = i + Caract.mobilitereduite
    If Me.Check1(4) Then i = i + Caract.logement
   
    Me.List1.AddItem "Batiment 1 =" & i
       
End Sub

Private Sub Command2_Click()
    Dim s As String
    Dim i As Integer
   
    Call RAZ
   
    s = Me.List1.Text
    i = CInt(Mid(s, InStr(1, s, "=") + 1))
   
    If i And Caract.travailleur Then Me.Check1(0).Value = 1
    If i And Caract.dupublic Then Me.Check1(1).Value = 1
    If i And Caract.enfants Then Me.Check1(2) = 1
    If i And Caract.mobilitereduite Then Me.Check1(3) = 1
    If i And Caract.logement Then Me.Check1(4) = 1
   
   
   
End Sub

Private Sub RAZ()
    Me.Check1(0).Value = 0
    Me.Check1(1).Value = 0
    Me.Check1(2).Value = 0
    Me.Check1(3).Value = 0
    Me.Check1(4).Value = 0
End Sub

Programmix
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
    If Me.Check1(0) Then i = i Or Caract.travailleur
    If Me.Check1(1) Then i = i Or Caract.dupublic
    If Me.Check1(2) Then i = i Or Caract.enfants
    If Me.Check1(3) Then i = i Or Caract.mobilitereduite
    If Me.Check1(4) Then i = i Or Caract.logement



Ca ne sert à rien d'additionner d'autant plus que ça traine !
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Là par contre, tu m'embrouilles...

Peux-tu m'expliquer ce qui se passe lorsqu'on fait i = i Or caract.dupublic par rapport à mon addition ?

Programmix
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
Et ça prend moins de temps à exécuter !
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Une autre question...

Si cela est possible, comment faire pour utiliser cela de manière dynamique ?

Je m'explique.
Plutôt que de coder "en dur" 4 ou 5 catégories avec Enum, j'aimerais pouvoir utiliser un fichier dans lequel les catégories sont reprises et ainsi me donner la possibilité d'en ajouter/supprimer sans devoir recoder.

Programmix
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
Faut alors se baser sur l'index de l'objet + 1.
Mais tu dois leur en affecter un chacun.
Par exemple,
chk_Option1 -- Index 1 -- "mobilité réduite"
chk_Option1 -- Index 2 -- "tout public"
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Est-il possible de dépasser les 32 options ou non ?

Programmix
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
Tu devras utiliser 2 longs
Messages postés
1134
Date d'inscription
mercredi 2 octobre 2002
Statut
Membre
Dernière intervention
24 juillet 2011
1
Là, je ne vois pas...

2 longs ? => 2 variables ?

Programmix
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
11
Oui, 2 variables DWORD, c-à-d des Long en VB6.