(A > B)?A:B

Bonjour à tous ,

Dans mes codes , lorsque j’ai un test simple à faire , j’utilise (A > B)?A:B

Mon code suivant écrit sur un écran LCD I2C:

    /* Info change on LCD each 1 seconde */
    if(millis() - DebutChronoLcdMs >= 1000)//lets not saturate the loop() and makes the movement of servos more fluid
    {
      lcd.setCursor(0,0);lcd.print(F("[Speed  engines 1&2]"));
      lcd.setCursor(0,1);lcd.print(F("S1["));lcd.print(vitesse1);lcd.print(F("]"));lcd.setCursor(11,1);lcd.print(F("S2["));lcd.print(vitesse1);lcd.print(F("]"));
      lcd.setCursor(0,3);
      switch(StringToPrint)
      {
        case 0:lcd.print(F("Aux.:"));readAuxTypeLCD();break;
        case 1:lcd.print(F("Sync.:"));lcd.print((synchroIsActive == true)?"On  ":"Off ");break;
        case 2:lcd.print(F("T:"));lcd.print(GetTemp());lcd.print("\x06");lcd.print("C");break;
#ifdef EXTERNALVBATT
//        case 3:lcd.print(F("V:"));lcd.print((externalVBatt == true)?GetExternalVoltage():0.0);lcd.print("V  ");break;
        case 3:lcd.print(F("V:"));lcd.print(GetExternalVoltage());lcd.print("V  ");break;
#endif
      }
      lcd.setCursor(11,3);lcd.print(F("Secu.:"));lcd.print((SecurityIsON == true)?"On ":"Off");   
      (StringToPrint <= 3)?StringToPrint++:StringToPrint=0;       
      DebutChronoLcdMs=millis(); /* Restart the Chrono for the LCD */
    }

Le case 3: commenté ne fonctionne pas alors que le suivant fonctionne !
Le code que j’appelle lit une tension externe:

float GetExternalVoltage()
{
  externalVBatt = true;
  /*
  http://skyduino.wordpress.com/2012/08/09/arduino-mesurer-la-tension-dun-batterie/
  Celui ci a ete calcule pour permettre la mesure d'une plage de tension variant entre 0v et 20v.
  La formule classique d'un pont diviseur de tension est la suivante (je passe la partie theorie, loi des mailles, etc) :
  Vs = Vin * (R2 / (R1 + R2))
  Ici R1 = 3300 ohms (3k3) et R2 = 1100 ohms (1k1), on obtient donc pour Vin = 20v (maximum admissible) :
  Vs = 20 * (1100 / (3300 + 1100)) = 20 * (1100 / 4400) = 20 * 0.25 = 5
  Vs = 5v pour Vin = 20v, soit le maximum que peut mesurer le convertisseur analogique -> numerique de l'arduino (alimentation en 5v bien sur).

        +20V maxi
       -+-
        |
----.   # R1=3k3 = Orange Orange Rouge Or
    |   |
  A3|---+
    |   |        
NaNo|   # R2=1k1 = Marron Marron Rouge Or 
    |   |        
    |   |        
    |  -+-       
    |  GND      
----'        
  */  
  static float coeff_division = 4.0;
  /* Mesure de la tension brute */
  uint16_t raw_bat = analogRead(BROCHE_BATTEXT); //attention a I2C qui utilise les pins A4 et A5  
  /* Calcul de la tension reel */
  float real_bat = ((raw_bat * (5.0 / 1024)) * coeff_division);
//  /* Affichage */
//  Serial << real_bat << endl;
  return (real_bat);
}

Pourquoi la function GetExternalVoltage() n’est pas lancée lorsqu’elle se trouve encapsulé ainsi !

lcd.print(F("V:"));lcd.print((externalVBatt == true)?GetExternalVoltage():0.0);lcd.print("V  ");break;

Merci de vos explications !!!

Salut,

T’es sûr au moins que externalVBatt == true ?

Heuu, la question semble stupide mais en fait c'est la fonction elle même qui passe externalVBatt à true .

Donc , je dois regarder ça un peu mieux !

Bin oui mais dans le cas ou ça ne marche pas :

(externalVBatt == true)?GetExternalVoltage():0.0

Si externalVbatt vaut à l'origine 0, GetExternalVoltage() n'est jamais appelé et donc externalVbatt ne passe jamais à true

(A > B)?A:B

Bonjour,
c'est une nouvelle syntaxe ?

trimarco232:
Bonjour,
c’est une nouvelle syntaxe ?

Non ça existe depuis toujours dans le langage C. On appelle aussi ça l’opérateur ternaire.
Ca a la forme (condition)?:

Mais son utilisation est en fait généralement déconseillée car ça nuit a la lisibilité du code sans forcément être plus performant (j’ai pas vérifié).

Personnellement je ne l’utilise que très peu.
Je préfère écrire un if(a == true){
//action A
}else{
//action B
}
que (a==true)?A:B

ok, merci !
en effet, ça s'appelle "expression conditionnelle" dans mon cours
jamais utilisée, oubliée ...

Le seul avantage de "condition ? a : b" par rapport à un if, est que l'opérateur ternaire peut être membre d'une expression, au contraire d'un if.

Du genre printf("La condition est %s\n", condition ? "vraie" : "fausse");