Pb - stockage de deux valeurs dans une variable

Résolu
lectpe Messages postés 162 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 17 juillet 2010 - 30 oct. 2009 à 20:05
lectpe Messages postés 162 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 17 juillet 2010 - 31 oct. 2009 à 14:08
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
31 oct. 2009 à 12:38
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

3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 oct. 2009 à 20:36
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++
0
lectpe Messages postés 162 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 17 juillet 2010 3
30 oct. 2009 à 21:51
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.
0
lectpe Messages postés 162 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 17 juillet 2010 3
31 oct. 2009 à 14:08
Merci à toi CptPingu. Je vais faire en me basant sur le code que tu viens d'écrire.
0
Rejoignez-nous