Vulgarisation de scope et volatile

Ce soir, avant d'aller au lit, je me questionnais sur les qualificatifs de variables, la première question qui m'est venu c'est "pourquoi?", ensuite, "pourquoi j'existe?" "Pourquoi je vis?"..

Je viens de me rendre compte la raison du pourquoi par rapport à static.. et const.. avec ce petit code que je me suis fait pour, justement, bien comprendre;

void setup () {
  Serial.begin(9600);
}

void loop () {
  const int dix = 10;
  Serial.print("const int zero = 10;  : ");
  Serial.println(dix);
  delay(4000);

  static int a = 100;
  Serial.print("static int a = 100;   : ");
  Serial.println(a);
  delay(4000);

  a = a+dix;
  Serial.print("a = a+dix;            : ");
  Serial.println(a);
  delay(4000);

  a = dix+dix;
  Serial.print("a = dix+dix;          : ");
  Serial.println(a);
  delay(4000);  

  Serial.print("Maintenant, petit Jeremy, nous allons voir ce qu'il se passe lorsque le loop recommence...");
  delay(1000);  
  Serial.print("\nEs-tu près? Allons-y! D'ici 10 secondes...\n\n\n");
  delay(10000);  
}

Maintenant, je me demandais si quelqu'un ici pouvait m'aider à clarifier, d'une façon stupide et rapide ces autres qualificatifs triviales du langage C;

scope
volatile

aussi, double versus float? C'est quoi la différence?

Faites un cours de base sur le C ou C++ ça aidera :slight_smile:

Pour const votre bout de code n’explique rien. vous ne le mettriez pas que ça fonctionnerait de la même façon. essayez de mettredix = dix *2; et de compiler et là vous verrez ce que const veut dire :slight_smile:

Scope = la portée de visibilité d’une variable ou d’une fonction. Une variable que vous définissez tout en haut de votre programme par exemple est dit globale à ce sketch et peut être utilisée partout dans ce sketch. Par opposition à une visibilité locale, si vous définissez une variable dans une fonction ‘comme les setup() ou loop() alors elle n’est visible que dans cette fonction. une variable locale peut avoir le même nom qu’une variable globale, auquel cas la variable locale cache la variable globale et c’est elle qui sera utilisée dans la fonction

static ça veut dire que c’est comme une variable globale - la mémoire reste allouée à la fin de la fonction mais la portée est limitée à la portée courante. Une variable static dans une fonction sera donc comme une variable globale du fichier mais uniquement visible dans cette fonction

Volatile = un peu plus compliqué à comprendre. ça dit au compilateur attention cette variable peut changer de manière impromptue lors de l’exécution d’une fonction et donc ne pas la stocker dans un registre pour la durée de la fonction, aller la lire ou écrire à chaque fois que nécessaire en mémoire. ça sert le plus souvent pour les interruptions.

imaginez que vous ayez une roue qui tourne et à chaque tour elle appuie sur un petit bouton. si vous attachez une interruption à ce bouton vous pouvez compter dans une variable globale le nombre de tour et dans le programme principal (dans une boucle while par exemple) calculer en fonction du temps qu’il sest écoulé la vitesse moyenne de rotation de la roue. dans ce cas lors de l’execution du calcul mathématique de la vitesse le compilateur va se dire je suis dans un while, je conserve dans un registre le nombre de tour comme ça le calcul sera plus rapide - mais dans ce cas même si vous avez des interruptions qui modifient le nombre de tour, votre while ne verra pas de changement car la formule ne relis pas la mémoire. Si votre nombre de tour est volatile alors le compilateur ira toujours lire et écrire dans la ram la valeur et donc tout fonctionnera (avec d’autres subtilités pour des variable sur sur plusieurs octets en cas d’interruptions mais c’est pour un autre post :slight_smile: )