Pb - stockage de deux valeurs dans une variable [Résolu]

Signaler
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
-
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
-
Bonjour.

J'ai créé une structure représentant une fonction mathématique dans laquelle est défini une variable "Domain" qui correspond au type de la fonction qui permet de la classer selon différentes catégories.

Ces catégories sont :
Fonctions de bases (puissance, factorielle, exponentielle, inverse...)
Fonctions particulières (indicatrice d'Euler)
Fractions (mise en fraction, simplification de fraction...)
Paire de nombres (PGCD, PPCM...)
Primalité (décomposition en facteurs premiers...)
Statistiques (moyenne, écart-type, variance...)
Trigonométrie (cosinus, sinus, tangente, cosinus hyperbolique...)

Le problème est que l'une des fonctions que j'ai implémentée qui sert à vérifier si deux nombres sont premiers entre eux se trouve dans deux catégories : Primalité et Paire de nombres.

Ma structure étant définie ainsi :
typedef struct
{
...
int Domain;
...
}FUNCTION;

Chaque catégorie correspondant à un "int", je ne peux pas mettre les deux catégories dedans, je ne peux en mettre qu'une seule.

Je voudrais pouvoir faire comme lorsque l'on déclare les styles dans la fonction CreateWindow par exemple avec WS_CHILD | WS_VISIBLE.

Je voudrais donc savoir s'il serait possible de remplacer le type "int" par un autre afin de pouvoir ranger soit un, soit deux, soit plusieurs types dans la variable associée à ce type. (deux ça me suffirait pour l'instant)

En espérant votre aide au plus vite, je vous remercie par avance.

Grégory.

4 réponses

Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 février 2021
119
Brunews vient de te répondre, et t'en a expliquer le principe.
On peut mettre plusieurs valeurs dans une variable en utilisant une astuce avec des décalage de bits.

Code:
#include <stdio.h>

static const int WS_INIT = 1;
static const int WS_CHILD = 2 << 0;
static const int WS_VISIBLE = 2 << 1;
static const int WS_ONTOP = 2 << 2;
static const int WS_POUET = 2 << 3;

void contains(int option)
{
  printf("Option = %i\n", option);

  printf("WS_INIT: %s\n", option & WS_INIT ? "OK" : "Non");
  printf("WS_CHILD: %s\n", option & WS_CHILD ? "OK" : "Non");
  printf("WS_VISIBLE: %s\n", option & WS_VISIBLE ? "OK" : "Non");
  printf("WS_ONTOP: %s\n", option & WS_ONTOP ? "OK" : "Non");
  printf("WS_POUET: %s\n", option & WS_POUET ? "OK" : "Non");
  printf("\n");
}

int main(void)
{
  int option = 0;

  printf("%i, %i, %i, %i, %i\n", WS_INIT,
 WS_CHILD, WS_VISIBLE, WS_ONTOP, WS_POUET);

  option = WS_CHILD | WS_VISIBLE;
  contains(option);
  contains(WS_INIT);
  contains(WS_INIT | WS_VISIBLE | WS_POUET);
  contains(WS_INIT | WS_CHILD | WS_VISIBLE | WS_ONTOP | WS_POUET);

  return 0;
}


Sortie:
1, 2, 4, 8, 16
Option = 6
WS_INIT: Non
WS_CHILD: OK
WS_VISIBLE: OK
WS_ONTOP: Non
WS_POUET: Non

Option = 1
WS_INIT: OK
WS_CHILD: Non
WS_VISIBLE: Non
WS_ONTOP: Non
WS_POUET: Non

Option = 21
WS_INIT: OK
WS_CHILD: Non
WS_VISIBLE: OK
WS_ONTOP: Non
WS_POUET: OK

Option = 31
WS_INIT: OK
WS_CHILD: OK
WS_VISIBLE: OK
WS_ONTOP: OK
WS_POUET: OK

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Le 'style' d'une fenetre n'est qu'un INT, pas une structure. On remplit ses bits par des OR, voila tout.
Pour résumer, style ne peut contenir que 32 styles, différents ou combinés.

Si tu considères par contre Domain sur sa valeur et non ses bits, tu peux y mettre plus de 4 milliards de possibilités de choix.

ciao...
BruNews, MVP VC++
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
Merci d'avoir répondu.

Le problème, c'est que je voudrais mettre deux valeurs en même temps dans la même variable en les associant avec un OR. Alors je ne sais pas si c'est possible et si ça l'est, je ne sais pas comment faire.

Parce que ça m'embête de créer une deuxième variable, juste pour une seule fonction, mais si c'est la seule solution, bah je ferai ça.
Messages postés
162
Date d'inscription
lundi 12 novembre 2007
Statut
Membre
Dernière intervention
17 juillet 2010
3
Merci à toi CptPingu. Je vais faire en me basant sur le code que tu viens d'écrire.