[C] - Manipulation de variables dans une instruction "if"
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

[C] - Manipulation de variables dans une instruction "if"



  1. #1
    invite3c35244f

    [C] - Manipulation de variables dans une instruction "if"


    ------

    Bonjour,

    en langage C, afin de ne pas créer trop de variables, j'aurai voulu savoir si il était possible de manipuler une variable (ET / OU / décalage) dans une condition de type if.
    Exemple, je souhaite savoir si le bit 1 de ma variable uint_DefTab est à 1 :

    Code:
    unsigned int uint_DefTab = 0;
    (...)
    uint_DefTab = 0b0000000000000011;
    (...)
    if(((uint_DefTab&&0x0002)>>1)==1)
    { ... }
    Merci d'avance,

    -----

  2. #2
    invite3c35244f

    Re : [C] - Manipulation de variables dans une instruction "if"

    En fait, on peut mais dans mon cas, il faut que je ne mette que un seul "&" ... et ça fonctionne!

  3. #3
    Jack
    Modérateur

    Re : [C] - Manipulation de variables dans une instruction "if"

    en langage C, afin de ne pas créer trop de variables, j'aurai voulu savoir si il était possible de manipuler une variable (ET / OU / décalage) dans une condition de type if.
    Oui bien sur!
    Exemple, je souhaite savoir si le bit 1 de ma variable
    uint_DefTab est à 1 :
    Code:
    if (uint_DefTab & 2)
      // code exécuté si le bit 1 de la variable est égal à 1
    tout simplement

    A+

  4. #4
    invited9b9018b

    Re : [C] - Manipulation de variables dans une instruction "if"

    Bonsoir,

    L'opérateur "&&" est un "et" logique.
    En gros, lorsque vous écrivez : if(A && B)
    le test sera vrai si A != 0 ET B != 0.

    Il diffère donc de l'opérateur & (ET "bit à bit") dont vous avez besoin ici.

    Au final la condition peut être simplifiée (comme l'a dit Jack) de la façon suivante :
    Code:
    if(var & mask)
    (S'il n'y a aucun bit "concordant" entre le masque et la variable testée, le test échoue).

    Mais attention : si vous souhaitez faire des masques portant sur plusieurs bits et que vous désirez également que tous les bits de ton masque soient égaux à 1 dans la variable "var", il faut rajouter modifier légèrement cette condition :
    Code:
    if((var & mask) == mask)
    A+,

  5. A voir en vidéo sur Futura
  6. #5
    invite2d7144a7

    Re : [C] - Manipulation de variables dans une instruction "if"

    Bonjour,

    +1, et d'autre part, vouloir "gagner" une variable est habituellement un raccourci pour un plantage droit dans le mur.

    La première qualité d'un code source est d'être clair, lisible et facilement maintenable par n'importe quel programmeur.

    Ce n'est pas le cas de ton code, et t'orienter vers ce genre de raccourci n'est pas une bonne option, alors que manifestement tu ne maîtrises pas du tout le langage (c'est également une mauvaise habitude pour ceux qui le maîtrisent, alors ...).

  7. #6
    inviteb9f49292

    Re : [C] - Manipulation de variables dans une instruction "if"

    La première qualité d'un code source est d'être clair, lisible et facilement maintenable par n'importe quel programmeur.
    Je suis plus que complètement daccord sur ce point qui est CRUCIALE.
    Mais
    Code:
    if (x & 1) {...
    me semble quand même complètement compréhensible _ET_ réfleter clairement l'intention du programmeur: si le 1er bit de x est non-nul... Par contre, si l'intention est de tester la non parité d'un nombre, la question se pose plus...

  8. #7
    invite2d7144a7

    Re : [C] - Manipulation de variables dans une instruction "if"

    Bonjour,

    Je n'ai rien dit concernant cette forme, on peut même dire qu'elle est standard.

    Mais pour ce que jorg1n écrit
    Code:
    if(((uint_DefTab&&0x0002)>>1)==1)
    Bien sûr, je comprends très bien ce qu'il fait, mais de son côté, ça le met déjà dans les choux, puisqu'il n'a pas compris pourquoi il lui a fallu doubler le &.

    Mais dans tous les cas, il faut rendre le code clair, en aérant un peu avec des espaces (sa ligne de code pique les yeux).

    En écrivant ainsi (ou quelque chose d'approchant) :
    Code:
    if (( (uint_DefTab && 0x0002) >> 1)==1)
    c'est tout de suite plus clair, non ?

  9. #8
    Dlzlogic

    Re : [C] - Manipulation de variables dans une instruction "if"

    Bonjour,
    Pour appuyer tout ce qui vient d'être dit, j'utilise aussi cette méthode. J'ai un entier qui ne sert qu'au codage des objets. J'ai soigneusement défini la définition de chaque bit, j'ai un #défine qui fixe tout ça, mais tant pour la modification que pour la lecture, j'ai des fonctions. L'intérêt est que dans le code on a seulement des choses comme
    Code:
    il (UnObjet->LitType(LIGNE))  // donc c'est une ligne
    {
      ...
    }
    Les 2 ou 3 fonctions concernées sont écrites une fois pour toutes et le code est clair.

  10. #9
    Jack
    Modérateur

    Re : [C] - Manipulation de variables dans une instruction "if"

    Il existe une solution très utilisée en programmation de microcontrôleurs par exemple: les bits fields. Si la notation variable.bitNbr peut sembler lourde, un #define variable.bitNbr fonctionDuBit résout le problème.

    A+

  11. #10
    Dlzlogic

    Re : [C] - Manipulation de variables dans une instruction "if"

    Oui, je comprends.
    Dans mon cas, "UnObjet" est un pointeur sur un matricule.
    La classe TMatricule gère les caractéristiques non-graphiques de tous mes objets (Points, Lignes, Zones etc.)
    Le nom des pointeurs sur TMatricule peut être n'importe quoi (ex Mat1, Mat2, mm etc.).
    Par ailleurs, rien ne m'interdit de mettre comme paramètre de la fonction "LIGNE & VISIBLE & UTILE".
    C'est à dire que l'Objet en question sera une ligne, visible et utile.
    Et aussi, pour des raisons historiques, je n'utilise les #défine que pour des valeurs (sauf min et max).
    Mais comme je suis complètement autodidacte en la matière, je ne suis pas forcément un bon exemple.

  12. #11
    invited9b9018b

    Re : [C] - Manipulation de variables dans une instruction "if"

    Bonsoir,

    Citation Envoyé par whoami Voir le message
    Bonjour,

    +1, et d'autre part, vouloir "gagner" une variable est habituellement un raccourci pour un plantage droit dans le mur.

    La première qualité d'un code source est d'être clair, lisible et facilement maintenable par n'importe quel programmeur.

    Ce n'est pas le cas de ton code, et t'orienter vers ce genre de raccourci n'est pas une bonne option, alors que manifestement tu ne maîtrises pas du tout le langage (c'est également une mauvaise habitude pour ceux qui le maîtrisent, alors ...).
    Oui, bien sur.
    Je vais d'ailleurs faire une remarque supplémentaire sur un détail (simple suggestion) :

    Pourquoi rappeler le type d'une variable dans son nom (par exemple "uint_DefTab"). C'est lourd, et tout éditeur de code qui se respecte aujourd'hui permet de connaître le type de chaque variable n'importe où dans le code non ? (sur ms visual c++, le type est donné simplement en survolant le nom de la variable dans le code).

    A+,

Discussions similaires

  1. aide pour manipulation de "coin de table"
    Par invite94bafa0d dans le forum TPE / TIPE et autres travaux
    Réponses: 0
    Dernier message: 01/02/2010, 22h33
  2. Dit t'on qu'une Fusée "Vole" ou "Flotte" dans l'espace ?
    Par invitefd223ee7 dans le forum Astronautique
    Réponses: 12
    Dernier message: 11/09/2009, 14h04
  3. Maple : comment introduire des valeurs locales de variables dans "plot" ?
    Par invitebd8dbca5 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 17/09/2007, 23h13
  4. Instruction "delay" CC11 pour 68HC11F1
    Par invitea88e6ae4 dans le forum Électronique
    Réponses: 12
    Dernier message: 05/06/2007, 17h35
  5. Une "couleur", "race" unique dans 50 000 ans?
    Par invite287f4e7c dans le forum Biologie
    Réponses: 1
    Dernier message: 13/12/2006, 11h26