[C] figer la valeur d'une variable

matéo -  
 matéo -
Bonjour,

Pour mon BTS IRIS j'ai besoin de développer une fonction qui permet de récuperer la valeur d'une varaiable augmentant continuellement à un moment voulu.

Mon problème c'est que le résultat m'affiche tout le temps 0.

Est ce que qq'un pourrait me faire un exemple tout bête?!

PS: Voici mon algo en 2 mots -->

//déclarations variables
float Opacity, temp_Opacity, memo_Opacity;

//fonction affichage opacité mémorisée
CASE slot1
IF slot1.seuil_min <= slot1.Opacity <= slot1.seuil_max
ALORS
temp_Opacity = Opacity;
memo_Opacity = temp_Opacity;
SetCtrlAttribute(mainPanel3, MainPanel3_OpacityButton, ATTR_CTRL_VAL, memo_Opacity)
Configuration: Windows XP
LabWindows/CVI

4 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,
    Si ton code c'est du C, donne nous plutôt le code ;). Et utilise la balise "conservation automatique du code" (à droite de souligner).
    Cdt
    0
    1. matéo
       
      switch (index)
      {
      case 0: SetCtrlAttribute(mainpanel3,MainPanel3_VEILLE1,ATTR_TEXT_BGCOLOR, VAL_TRANSPARENT);
      SetCtrlAttribute(mainpanel3,MainPanel3_VEILLE1,ATTR_TEXT_COLOR, VAL_BLACK);
      SetCtrlAttribute(mainpanel3,MainPanel3_ALARM1,ATTR_TEXT_BGCOLOR, VAL_YELLOW);
      SetCtrlAttribute(mainpanel3,MainPanel3_ALARM1,ATTR_TEXT_COLOR, VAL_RED);
      //ALARME_1... = VISIBLE
      SetCtrlAttribute(mainpanel3,MainPanel3_ALARME_11,ATTR_VISIBLE, 1);
      if (slt[0].Seuil_MIN <= slt[0].Opacity <= slt[0].Seuil_MAX)
      {
      SetCtrlAttribute(mainpanel3,MainPanel3_CONFORME1,ATTR_TEXT_COLOR, VAL_RED);
      SetCtrlVal(mainpanel3,MainPanel3_CONFORME1,NON_CONFORME);
      }
      0
      1. matéo > matéo
         
        ME SUIS TROMPE...
        VOICI LE VRAI

        switch (index)
        {
        case 0: SetCtrlAttribute(mainpanel3,MainPanel3_VEILLE1,ATTR_TEXT_BGCOLOR, VAL_TRANSPARENT);
        SetCtrlAttribute(mainpanel3,MainPanel3_VEILLE1,ATTR_TEXT_COLOR, VAL_BLACK);
        SetCtrlAttribute(mainpanel3,MainPanel3_ALARM1,ATTR_TEXT_BGCOLOR, VAL_YELLOW);
        SetCtrlAttribute(mainpanel3,MainPanel3_ALARM1,ATTR_TEXT_COLOR, VAL_RED);
        //ALARME_1... = VISIBLE
        if (slt[0].Seuil_MIN <= slt[0].Opacity <= slt[0].Seuil_MAX)
        {
        SetCtrlAttribute(mainpanel3,MainPanel3_CONFORME1,ATTR_TEXT_COLOR, VAL_RED);
        SetCtrlVal(mainpanel3,MainPanel3_CONFORME1,NON_CONFORME);
        GetCtrlVal (mainpanel3, MainPanel3_OPACITY, temp_Opacity10);
        temp_Opacity10 = slt[0].Opacity;
        SetCtrlAttribute(mainpanel3,MainPanel3_OPACITY1,ATTR_CTRL_VAL,temp_Opacity10);
        }
        0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    qu'est ce qui détermine le moment voulu ?
    0
    1. matéo
       
      Ce qui détermine le moment c'est quand le détecteur passe en alarme, il doit mémoriser la valeur à cet instant là.
      0
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    (slt[0].Seuil_MIN <= slt[0].Opacity <= slt[0].Seuil_MAX) !
    pour moi c'est toujours vrai !
    a<b<c est lu en c ainis : (a<b)<c, c'est à dire que tu compare un booléen à c. Pour peu que c soit plus grand que 1, c'est toujours vrai.
    0
    1. matéo
       
      En faite,

      l'opacité démarre à 0 et augmente constamment.
      Le seuil_MIN est délimité par exemple a 0.185 et le seuil_MAX à 0.215.
      En faite on rentre dans l'instruction IF si lorsque çà passe en alarme, l'opacité réel est comprise entre le Seuil_MIN et le Seuil_MAX.
      0
      1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > matéo
         
        Oui mais dans ton cas, on ne rentre jamais dans la boucle.
        if (slt[0].Seuil_MIN <= slt[0].Opacity <= slt[0].Seuil_MAX) 
        doit être remplacé par
        if (slt[0].Seuil_MIN <= slt[0].Opacity && slt[0].Opacity <= slt[0].Seuil_MAX) ! 


        Pour t'en convaincre, prenons le cas stslt[0].Opacity= 0.2 (on doit donc rentrer dans la boucle).
        0.185<=0.2 renvoie 1 (true). Donc slt[0].Seuil_MIN <= slt[0].Opacity <= slt[0].Seuil_MAX donne 0.185<=0.2<=0.25, soit 1<=0.25, ce qui est faux.
        Cdt
        0
      2. matéo > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        OK, j'te remercie, j'vais tester la fonction plus tard en entreprise.
        C'est vrai que j'avais constaté quand je compilé , à chaque fois çà sautais la boucle. Merci et je verrai si çà marche
        0
  4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    attantion aussi avec le switch au fait que à la fin d'un case, si tu ne met pas de break, tu fait les instructions qui suivent.
    0
    1. matéo
       
      oui, j'ai fait un case 1, case 2 ... en fonction du nombre de slot que j'ai
      Et j'ai bien mis mon break =)
      0