Utiliser une variable numérique pour mémoriser des valeurs

Résolu
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 - 28 févr. 2009 à 12:32
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 2 avril 2009 à 19:08
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

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
28 févr. 2009 à 13:28
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
3
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
28 févr. 2009 à 16:31
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.
3
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
28 févr. 2009 à 12:34
Je crois qu'il s'agit là d'une manière de convertir les variables qui était utilisée au temps du DOS...

Programmix
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 févr. 2009 à 12:51
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
28 févr. 2009 à 13:18
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
0
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
28 févr. 2009 à 13:40
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
0
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
28 févr. 2009 à 14:35
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
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
28 févr. 2009 à 15:44
    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 !
0
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
28 févr. 2009 à 15:53
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
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
28 févr. 2009 à 20:17
Et ça prend moins de temps à exécuter !
0
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
14 mars 2009 à 09:48
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
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
14 mars 2009 à 09:57
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"
0
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
29 mars 2009 à 14:21
Est-il possible de dépasser les 32 options ou non ?

Programmix
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
31 mars 2009 à 19:47
Tu devras utiliser 2 longs
0
cs_PROGRAMMIX Messages postés 1133 Date d'inscription mercredi 2 octobre 2002 Statut Membre Dernière intervention 24 juillet 2011 2
31 mars 2009 à 21:06
Là, je ne vois pas...

2 longs ? => 2 variables ?

Programmix
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
2 avril 2009 à 19:08
Oui, 2 variables DWORD, c-à-d des Long en VB6.
0
Rejoignez-nous